학습 모드와 평가 모드는 다르게 동작해
일부 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에서 계속 집계하고, 에폭이 끝날 때 한 번만 동기화해.
전처리 불일치 — 학습할 때는 데이터 증강을 적용해. 무작위 크롭, 반전, 색상 변형이 여기에 들어가. 평가할 때는 크기 조정, 중앙 크롭, 정규화처럼 결과가 일정한 전처리만 사용해. 둘을 뒤섞는 건 비전 학습에서 가장 흔한 조용한 버그 중 하나야.