본문 바로가기

개발 공부/딥러닝

[Deep Learning] CIFAR10 컬러 이미지 CNN | 흑백 CNN에서 RGB CNN으로 확장하기

앞에서는 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 크기만 맞춰주면 같은 구조를 확장해서 사용할 수 있었다.

반응형