이미지 분류의 학습과 평가 분리하기
인공지능응용 · 10주차
이번 주 목표 · MNIST를 읽고 학습한 뒤 새 이미지의 예측과 오분류를 확인합니다.
실행: Colab에서 내 Drive에 사본을 저장한 뒤 Code Cell의 ▶ 또는 Shift+Enter로 위에서부터 실행하세요. ⟦직접 입력⟧ 표시가 있는 Text Cell은 더블클릭해서 수정합니다.
모델에 데이터를 넣기까지
9주차의 CNN에 실제 MNIST 이미지를 넣습니다. Dataset[i]는 이미지 한 장과 Label, DataLoader는 여러 장을 묶은 Batch를 제공합니다. ToTensor()를 거친 흑백 이미지 (1,28,28)가 Batch에서 (N,1,28,28)이 됩니다. 학습과 평가 모두 이 변환을 사용하며 원본 정수 Pixel 배열을 그대로 평가 모델에 넣지 않습니다.
1. 데이터 하나를 먼저 살펴보기
MNIST는 28×28 흑백 손글씨 숫자와 0~9 label로 구성됩니다. 데이터 전체를 학습하기 전에 이미지 한 장을 그려 보고 Tensor(텐서) shape와 label을 출력하세요.
데이터 하나를 먼저 살펴보기
ToTensor는 이미지 값을 Tensor로 바꿉니다. 추가 Normalization을 적용하면 학습·평가에 같은 변환을 사용해야 합니다. 이미지가 뒤집혀 보이면 shape와 표시할 축을 확인하세요.
2. DataLoader는 Batch를 만든다
Dataset은 한 표본을 꺼내는 규칙이고 DataLoader는 표본을 묶어 순회하는 도구입니다. 학습에서는 shuffle로 순서를 섞고, 평가에서는 모든 표본을 빠짐없이 한 번씩 처리합니다.
DataLoader는 Batch를 만든다
마지막 Batch는 앞선 Batch보다 작을 수 있습니다. Accuracy(정확도)는 Batch Accuracy의 단순 평균보다 정답 개수 합을 실제 표본 수로 나누어 계산하는 것이 안전합니다.
3. 학습과 평가는 다른 모드
학습은 model.train()에서 Gradient(기울기)를 계산하고 Parameter를 갱신합니다. 평가는 model.eval()과 no_grad()를 사용해 갱신 없이 결과를 계산합니다. eval은 Dropout 같은 Layer의 동작을 평가용으로 바꾸고, no_grad는 Gradient 계산 기록을 멈춥니다. 따라서 평가할 때 둘 다 사용합니다.
학습과 평가는 다른 모드
eval은 Dropout 등의 동작을 바꾸고 no_grad는 Gradient 추적을 끕니다. 평가 데이터로 optimizer.step을 수행하면 평가의 의미가 사라집니다.
4. 숫자와 이미지를 같이 확인
test accuracy를 계산한 뒤 이미지 10장의 예측·정답을 함께 표시합니다. 틀린 이미지도 최대 다섯 장 확인하세요. 첫 화면에서 맞는 예만 고르는 대신 데이터 순서대로 선택하면 기록이 덜 편향됩니다.
숫자와 이미지를 같이 확인
빠른 실행 모드에서는 데이터 일부만 사용해 CPU로도 학습·평가 코드가 잘 실행되는지 확인합니다. 전체 데이터 실습과 결과를 비교할 때 사용 표본 수·epoch·실행 모드를 반드시 적으세요. 빠른 실행의 Accuracy를 전체 실험으로 보고하지 않습니다.
학습 내용 확인
- 코드에 넣을 값은 무엇이며, 결과 배열의 각 행·열은 무엇을 뜻하나요? 물리량을 계산한다면 단위도 확인했나요?
- 조건을 하나 바꿨을 때 다시 실행해야 하는 부분을 찾을 수 있나요?
- 실행 결과가 예상과 맞나요? 다르다면 출력값이나 그래프를 보고 이유를 설명할 수 있나요?
실습 자료
- AI_Applications_Week10_ImageClassification.ipynbColab 노트북 미리보기 · Colab 노트북 다운로드
- L17_Image_Classification_MNIST.ipynbColab 노트북 미리보기 · Colab 노트북 다운로드