PyTorch 학습기 튜토리얼 2편으로, 1편의 Basic-Trainer 를 이미지 분류용으로 키운다. MNIST 대신 폴더 구조로 만든 커스텀 데이터셋을 쓰고, VGGNet 기반 CNN 모델과 학습률 스케줄러, GPU 디바이스 설정과 tqdm 진행 표시까지 붙인다.
핵심 포인트- 데이터셋은 `dataset/train` 아래에 클래스 이름별 폴더를 두면 `ImageFolder` 가 자동으로 클래스와 index 를 만들어 준다.
- 전처리는 256 으로 Resize → 중앙 224×224 CenterCrop → Tensor 변환 → 정규화 순이며, mean·std 는 ImageNet 에서 추출한 일반값을 쓴다.
- 정규화는 연산 효율을 올리기 위한 것이고 거치지 않아도 학습은 된다고 명시한다.
- 클래스와 index 매핑은 dict 로 만들어 json 으로 저장해 두고, train 과 eval 두 데이터셋의 클래스가 다르지 않은지 검사한다.
- 모델은 VGG11 구조를 뼈대로 classifier layer 와 기본 클래스 수를 줄인 소형 모델이며, optimizer 는 Adam 에 선형 스케줄러를 얹는다.
상세 정리- 목표를 먼저 못 박는다. 수집된 이미지에서 분류를 파악하고 그에 맞는 모델을 만들어 학습까지 이어지는 Image-Classification-Trainer 를 구성한다.
- 권장 환경은 1편과 같은 계열로 명시하고, 1편에서 정리한 학습기 필수 구성 요소를 하나씩 되짚으며 고도화하는 순서를 따른다.
- 텐서 형태: 이미지 한 장은 (3, 224, 224) 크기의 Float 텐서가 되며 차원은 (RGB 채널, 높이, 너비) 로 해석한다.
- DataLoader 는 학습용은 `shuffle=True`, 평가용은 랜덤 호출이 필요 없으므로 `False` 로 둔다.
- 검증 습관: iterator 로 한 배치만 꺼내 `input: torch.Size([batch, 3, 224, 224])`, `target: torch.Size([batch])` 형태가 맞는지 확인하고 break 한다.
- 파일 분리: 데이터셋 코드는 별도 파일에 두고 `if __name__ == '__main__'` 아래 예시를 참고해 trainer 파일에서 불러 쓰는 구조로 만든다.
- 모델 구성: `vgg_model.py` 에 VGG 구조 정보(cfg)로부터 Feature 추출기를 만들고, 추출된 특징에서 클래스를 추측하는 classifier 를 붙이며, 가중치 초기화 로직도 포함한다.
- 모델도 빌드 후 테스트 텐서를 넣어 출력이 나오는지 먼저 확인하는 흐름을 유지한다.
- Criterion 은 1편과 같이 다중 분류에 많이 쓰는 `CrossEntropyLoss` 를 지정한다.
- Optimizer 는 SGD 대신 Adam(Adaptive Moment Estimation)을 적용하고, 파라미터와 learning rate 를 넘겨 `optimizer.step()` 으로 갱신하는 구조는 동일하다.
- 스케줄러의 근거: 초기 학습률이 너무 작으면 수렴까지 오래 걸리지만, 충분히 학습된 뒤 학습률을 줄이면 시간을 단축하면서 작은 보폭으로 더 정확하게 수렴한다.
- 여기서는 주어진 step 마다 학습률을 선형으로 바꾸는 스케줄러를 쓰되, 다양한 형태를 쓰거나 커스텀할 수 있다고 덧붙인다.
- Train Iterator 자체는 1편과 큰 차이가 없고, 앞서 만든 dataloader·model·optimizer·scheduler 를 모아 step 을 돌린다.
- 추가된 것은 GPU 가속을 위한 Device 세팅과, tqdm 으로 학습 상태를 시각화하는 코드다.
왜 읽나MNIST 예제를 넘어 자기 이미지로 분류 모델을 학습시키려는 사람에게 데이터셋 구성부터 스케줄러·GPU 설정까지의 확장 경로를 준다.