① NLLLoss 역시 크로스엔트로피 손실 함수(CrossEntropyLoss)와 마찬가지로 분류 문제에 사용합니다. 이 둘 간의 차이는 다음과 같습니다. 크로스엔트로피 손실 함수에는 LogSoftmax + NLLLoss가 포함되어 있습니다. 따라서 크로스엔트로피 손실 함수를 사용할 경우에는 소프트맥스를 명시하지 않아도 되지만 NLLLoss를 사용할 때는 사용자가 소프트맥스를 사용할 것임을 명시해야 합니다. 이러한 이유로 모델 네트워크 부분에서도 소프트맥스 활성화 함수를 지정해 주었습니다(코드 10-30 참고).
이제 모델을 평가하기 위한 함수를 정의합니다.
코드 10-34 모델 평가
def evaluate(model, input_lang, output_lang, sentences, max_length=MAX_LENGTH):
with torch.no_grad():
input_tensor = tensorFromSentence(input_lang, sentences[0]) ------ 입력 문자열을 텐서로 변환
output_tensor = tensorFromSentence(output_lang, sentences[1]) ------ 출력 문자열을 텐서로 변환
decoded_words = []
output = model(input_tensor, output_tensor)
for ot in range(output.size(0)):
topv, topi = output[ot].topk(1) ------ 각 출력에서 가장 높은 값을 찾아 인덱스를 반환
if topi[0].item() == EOS_token:
decoded_words.append('<EOS>') ------ EOS 토큰을 만나면 평가를 멈춥니다.
break
else:
decoded_words.append(output_lang.index2word[topi[0].item()]) ------ 예측 결과를 출력 문자열에 추가
return decoded_words
def evaluateRandomly(model, input_lang, output_lang, pairs, n=10): ------ 훈련 데이터셋으로부터 임의의 문장을 가져와서 모델 평가
for i in range(n):
pair = random.choice(pairs) ------ 임의로 문장을 가져옵니다.
print('input {}'.format(pair[0]))
print('output {}'.format(pair[1]))
output_words = evaluate(model, input_lang, output_lang, pair) ------ 모델 평가 결과는 output_words에 저장
output_sentence = ' '.join(output_words)
print('predicted {}'.format(output_sentence))