앞에서 생성한 모델을 위한 옵티마이저와 손실 함수를 지정합니다.
코드 8-18 옵티마이저와 손실 함수 지정
opt = torch.optim.Adam(model.parameters(), lr=0.01)
opt_dropout = torch.optim.Adam(model_dropout.parameters(), lr=0.01)
loss_fn = torch.nn.MSELoss()
이제 드롭아웃이 적용된 모델과 그렇지 않은 모델을 학습시키고 오차를 그래프로 출력합니다.
코드 8-19 모델 학습
max_epochs = 1000
for epoch in range(max_epochs):
pred = model(x_train) ------ 드롭아웃이 적용되지 않은 모델 학습
loss = loss_fn(pred, y_train)
opt.zero_grad()
loss.backward()
opt.step()
pred_dropout = model_dropout(x_train) ------ 드롭아웃이 적용된 모델 학습
loss_dropout = loss_fn(pred_dropout, y_train)
opt_dropout.zero_grad()
loss_dropout.backward()
opt_dropout.step()
if epoch % 50 == 0: ------ epoch를 50으로 나눈 나머지가 0이면 다음 진행
model.eval()
model_dropout.eval()
test_pred = model(x_test)
test_loss = loss_fn(test_pred, y_test)
test_pred_dropout = model_dropout(x_test)
test_loss_dropout = loss_fn(test_pred_dropout, y_test)
plt.scatter(x_train.data.numpy(), y_train.data.numpy(), c='purple', alpha=0.5, label='train')
plt.scatter(x_test.data.numpy(), y_test.data.numpy(), c='yellow', alpha=0.5, label='test')
plt.plot(x_test.data.numpy(), test_pred.data.numpy(), 'b-', lw=3, label='normal') ------ 파란색 실선으로 x축은 테스트 데이터셋, y축은 드롭아웃이 적용되지 않은 모델의 결과를 그래프로 출력
plt.plot(x_test.data.numpy(), test_pred_dropout.data.numpy(), 'g--', lw=3, label='dropout') ------ 초록색 점선으로 x축은 테스트 데이터셋, y축은 드롭아웃이 적용된 모델의 결과를 그래프로 출력
plt.title('Epoch %d, Loss=%0.4f, Loss with dropout=%0.4f' % (epoch, test_loss, test_loss_dropout)) ------ 에포크, 드롭아웃이 적용되지 않은 모델의 오차, 드롭아웃이 적용된 모델의 오차를 타이틀로 출력
plt.legend()
model.train()
model_dropout.train()
plt.pause(0.05)