인프런 커뮤니티 질문&답변

김현철님의 프로필 이미지
김현철

작성한 질문수

처음하는 딥러닝과 파이토치(Pytorch) 부트캠프 (쉽게! 기본부터 챗GPT 핵심 트랜스포머까지) [데이터분석/과학 Part4]

검증을 위한 딥러닝 모델 테스트 코드 작성하기

test data 의 loss 계산식 문의

작성

·

181

0

10_ADVANCE-EXAMPLE-MILTI-LABEL-CLASSIFICATION 과 11_MILTI-LABEL-CLASSIFICATION-DROPOUT-BATCHNORMALIZATION 강의자료에서 맨 밑부분의 테스트셋 기반 Evaluation 에서 test_loss 를 계산할 때 전체 데이터인 10000으로 나누셨는데, 왜 그러신건지 궁금해서 질문드립니다.

train 과 validation 의 loss 계산은 train_batches 와 val_batches 개수(for문 도는 횟수) 만큼만 나누셨는데 test loss 를 계산할 때는 minibatch 가 아닌 전체 데이터로 나누셔서 상대적으로 test data 의 loss 값이 작아보여서요.


test_loss = 0

correct = 0

wrong_samples, wrong_preds, actual_preds = list(), list(), list()

model.eval()

with torch.no_grad():

for x_minibatch, y_minibatch in test_batches:

y_test_pred = model(x_minibatch.view(x_minibatch.size(0), -1))

test_loss += loss_func(y_test_pred, y_minibatch)

pred = torch.argmax(y_test_pred, dim=1)

correct += pred.eq(y_minibatch).sum().item()

wrong_idx = pred.ne(y_minibatch).nonzero()[:, 0].numpy().tolist()

for index in wrong_idx:

wrong_samples.append(x_minibatch[index])

wrong_preds.append(pred[index])

actual_preds.append(y_minibatch[index])

test_loss /= len(test_batches.dataset)

답변 1

0

안녕하세요. 답변 도우미입니다.

이 질문에 대한 답변은 평가 방법의 일관성과 정확도 측정 방식의 차이에서 기인합니다. 학습, 검증, 테스트 단계에서 손실(Loss)을 계산하는 방법은 각 목적에 맞게 조정될 수 있습니다. 보통 학습과 검증 단계에서는 배치(batch) 단위로 손실을 계산하고, 이를 배치의 개수로 나누어 평균 손실을 구합니다. 이렇게 함으로써 각 배치의 크기가 일정하지 않더라도 전체적인 손실 추이를 안정적으로 측정할 수 있습니다.

반면, 테스트 단계에서는 전체 데이터셋을 대상으로 모델의 성능을 평가하고자 하는 경우가 많습니다. 테스트 데이터셋의 전체 크기로 손실을 나누는 것은 모델이 전체 테스트 데이터셋에 대해 얼마나 잘 작동하는지를 보여주는 것을 목적으로 합니다. 여기서 전체 데이터셋 크기로 나누는 이유는 테스트 데이터셋의 각 샘플이 모델 평가에 미치는 영향을 균등하게 반영하기 위함입니다.

이 방식은 테스트 데이터셋에 대한 손실을 일종의 "평균 손실"로 해석할 수 있게 하며, 모델이 실제로 배포되었을 때 예상할 수 있는 평균 성능을 추정하는 데 도움을 줍니다. 따라서 테스트 단계에서 전체 데이터셋으로 나누는 것은 모델의 일반화 성능을 정확하게 평가하기 위해 중요합니다.

단, 이러한 방식으로 계산된 테스트 손실이 상대적으로 작게 나타나는 것은, 평균을 내는 데이터의 양이 많기 때문에 발생할 수 있습니다. 각 배치의 손실을 모두 더한 후 전체 테스트 데이터셋의 크기로 나눔으로써, 모든 테스트 샘플에 대한 평균 손실을 계산하는 것입니다. 이는 특히 큰 데이터셋을 다룰 때 더욱 의미있는 평가 방법이 될 수 있습니다.

감사합니다.

잔재미코딩 드림.

김현철님의 프로필 이미지
김현철

작성한 질문수

질문하기