앞에서는 8×8 흑백 손글씨 데이터를 CNN으로 학습했다.
이번에는 같은 CNN 구조를 CIFAR10 컬러 이미지에 적용하면서 흑백 이미지와 컬러 이미지에서 무엇이 달라지는지 확인했다.
⠀
1. CIFAR10 데이터 불러오기

CIFAR10은
Train → 50,000개
Test → 10,000개
의 컬러 이미지로 구성된다.

⠀
2. 컬러 이미지는 Channel이 3개
DataLoader에서 한 Batch를 가져오면 Shape은
(64, 3, 32, 32)
이다.

흑백 손글씨에서는
color_size = 1
이었지만,
RGB 컬러 이미지에서는
color_size = 3
으로 바뀐다.
⠀
3. Conv2d의 in_channels도 3으로 변경

입력 Channel 수만 이미지에 맞게 바꿔주면 Conv2d의 기본 사용 방식은 동일하다.
실행 결과
(64, 3, 32, 32)
는 Conv2d를 통과한 뒤
(64, 10, 30, 30)
이 됐다.
⠀
4. ConvLayer 구조는 그대로 재사용

앞에서 만든 ConvLayer Class를 그대로 사용하고,
첫 입력 Channel만 3으로 변경했다.
두 번의 Conv2d와 MaxPool2d를 통과한 최종 Feature Map Shape은
(64, 10, 7, 7)
이었다.
⠀
5. DenseLayer 입력 크기도 달라진다
손글씨 데이터에서는 ConvLayer를 통과한 결과가
10 × 1 × 1
이었지만,
CIFAR10에서는
10 × 7 × 7
이 남는다.
따라서 DenseLayer에 들어가는 feature_size도 맞춰줘야 한다.

⠀
6. 컬러 이미지용 CNNModel


즉 손글씨 CNN과 구조 자체는 같고,
입력 Channel
ConvLayer 이후 남는 Feature 크기
만 데이터에 맞게 수정했다.
⠀
7. 학습 방식은 그대로 유지

모델 구조는 달라졌지만
CrossEntropyLoss
Adam
EarlyStopper
excu_training()
을 사용하는 학습 흐름은 그대로다.

⠀
8. CIFAR10 평가 결과
Best Model로 평가한 실행 결과에서
F1 Score ≈ 0.559
로 확인됐다.

손글씨 데이터보다 Class의 시각적 형태가 복잡하고 컬러 정보까지 포함되기 때문에
같은 단순 CNN 구조에서는 성능이 더 낮게 나온 것을 확인할 수 있었다.
⠀
9. 흑백 CNN과 컬러 CNN 비교
| 개념 | 기억할 내용 |
| 입력 Shape | 손글씨: (batch, 1, 8, 8) / CIFAR10: (batch, 3, 32, 32) |
| color_size | 손글씨 1 / CIFAR10 3 |
| ConvLayer 이후 | 손글씨 10×1×1 / CIFAR10 10×7×7 |
| target_size | 둘 다 10 Class |
| 학습 흐름 | CrossEntropyLoss + Adam + EarlyStopping 동일 |
| 핵심 | 데이터 Shape에 맞춰 입력 Channel과 Dense 입력 크기를 바꾸면 기존 CNN 구조를 재사용 가능 |
⠀
10. 전체 흐름 정리
Image Data
↓
Dataset
↓
DataLoader
↓
Conv2d + ReLU + MaxPool2d
↓
Feature Map 추출 / 압축
↓
Flatten
↓
Linear Layer
↓
Class Prediction
↓
Early Stopping으로 Best Model 저장
↓
F1 Score / Heatmap 평가
이번 실습에서 가장 중요한 점은 CNN으로 바뀌어도
Dataset
↓
DataLoader
↓
Model
↓
Loss
↓
Optimizer
↓
Training
↓
Evaluation
이라는 전체 PyTorch 흐름은 그대로라는 것이었다.
달라지는 부분은 데이터를 해석하는 모델 구조이며,
흑백에서 컬러 이미지로 바뀌어도 입력 Channel과 Feature 크기만 맞춰주면 같은 구조를 확장해서 사용할 수 있었다.