본문 바로가기
C.W.K.
Stream
Lesson 05 of 08 · published

평가 모드

~16 min · eval, dropout, batchnorm

Level 0호기심
0 XP0/73 lessons0/11 achievements
0/120 XP to next level120 XP to go0% complete

학습 모드와 평가 모드는 다르게 동작해

일부 PyTorch 층은 모델이 학습 중인지 평가 중인지에 따라 다르게 동작해. 드롭아웃과 BatchNorm이 대표적이고, LayerNorm은 affine=True여도 보통 두 모드에서 똑같이 동작해. 드롭아웃은 학습할 때 일부 유닛을 무작위로 0으로 만들고, 평가에서는 입력을 그대로 통과시켜. BatchNorm은 학습할 때 배치 통계를 사용하고, 평가에서는 누적 통계를 사용해. 모드 전환을 잊으면 눈에 띄는 오류 없이 지표에 잡음이 섞여.

model.train()model.eval()로 모드를 전환해. 이 설정은 재귀적으로 적용되므로 최상위 모듈에서 호출하면 모든 하위 모듈도 함께 전환돼.

팁: 습관을 들여. 모든 학습 루프는 model.train()으로 시작하고, 모든 검증 루프는 model.eval()로 시작해. 5줄 전에 올바르게 설정했다고 확신해도 다시 명시해.

평가 모드에서는 기울기 계산도 꺼

평가에는 기울기가 필요하지 않아. 기울기를 계산하면 메모리와 시간만 낭비해. 더 새롭고 빠른 torch.inference_mode() 또는 더 오래됐지만 대부분의 사용 사례에서 같은 효과를 내는 torch.no_grad()를 사용해.

흔한 평가 버그

GPU에서 정확도를 계산하면서 CPU 값을 출력하기: .item()을 호출할 때마다 CUDA 동기화가 강제로 일어나. 값은 GPU에서 계속 집계하고, 에폭이 끝날 때 한 번만 동기화해.

전처리 불일치 — 학습할 때는 데이터 증강을 적용해. 무작위 크롭, 반전, 색상 변형이 여기에 들어가. 평가할 때는 크기 조정, 중앙 크롭, 정규화처럼 결과가 일정한 전처리만 사용해. 둘을 뒤섞는 건 비전 학습에서 가장 흔한 조용한 버그 중 하나야.

원칙: 평가는 학습이 아니야. 같은 데이터 계층을 쓰더라도 모드와 전처리는 다르고, 기울기 그래프도 만들지 않아. 이 구분은 일찍 뼈에 새겨 둬. 그러면 '검증 손실이 학습 손실보다 높은 이유'를 찾느라 낭비하는 디버깅 시간을 무수히 줄일 수 있어.

Code

깔끔한 평가 함수·python
import torch

@torch.inference_mode()
def evaluate(model, loader, device):
    model.eval()
    correct, total, total_loss = 0, 0, 0.0
    loss_fn = torch.nn.CrossEntropyLoss(reduction="sum")
    for xb, yb in loader:
        xb, yb = xb.to(device, non_blocking=True), yb.to(device, non_blocking=True)
        logits = model(xb)
        total_loss += loss_fn(logits, yb).item()
        preds = logits.argmax(dim=-1)
        correct += (preds == yb).sum().item()
        total   += yb.size(0)
    return correct / total, total_loss / total

External links

Exercise

검증을 model.train() 상태로 한 번 돌려 봐. 이건 틀린 설정이야. 그다음 model.eval() 상태로 다시 돌려. 이번에는 올바른 설정이야. 두 지표를 비교해. 그 차이가 평가 모드가 왜 존재하는지 가장 직접적으로 보여 줘.

Progress

Progress is local-only — sign in to sync across devices.
이 페이지에서 버그를 발견하셨거나 피드백이 있으세요?문제 신고

댓글 0

🔔 답글 알림 (로그인 필요)
로그인댓글을 남기려면 로그인해 주세요.

아직 댓글이 없어요. 첫 댓글을 남겨보세요.