인코더와 어텐션 디코더를 이용하여 모델을 학습시키기 위한 함수를 정의합니다.
코드 10-38 어텐션 디코더 모델 학습을 위한 함수
def trainIters(encoder, decoder, n_iters, print_every=1000, plot_every=100, learning_rate=0.01):
start = time.time()
plot_losses = []
print_loss_total = 0
plot_loss_total = 0
encoder_optimizer = optim.SGD(encoder.parameters(), lr=learning_rate) ------ 인코더와 디코더에 SGD 옵티마이저 적용
decoder_optimizer = optim.SGD(decoder.parameters(), lr=learning_rate)
training_pairs = [tensorsFromPair(input_lang, output_lang, random.choice(pairs)) for i in range(n_iters)]
criterion = nn.NLLLoss()
for iter in range(1, n_iters + 1):
training_pair = training_pairs[iter - 1]
input_tensor = training_pair[0] ------ 입력+출력 쌍에서 입력을 input_tensor로 사용
target_tensor = training_pair[1] ------ 입력+출력 쌍에서 출력을 target_tensor로 사용
loss = Model(model, input_tensor, target_tensor, decoder_optimizer, criterion)
print_loss_total += loss
plot_loss_total += loss
if iter % 5000 == 0: ------ 모델을 7만 5000번 훈련을 진행하며 5000번째마다 오차를 출력
print_loss_avg = print_loss_total / 5000
print_loss_total = 0
print('%d, %.4f' % (iter, print_loss_avg))