본문 바로가기

개발 공부/딥러닝

[Deep Learning] PyTorch CNN 직접 구현 | Conv2d, MaxPool2d와 CNNModel

이전에는 이미지 전처리와 CNN의 기본 구조를 개념적으로 살펴봤다. 이번에는 실제 손글씨 이미지 데이터를 이용해 Dataset과 DataLoader를 만들고, Conv2d와 MaxPool2d를 직접 적용한 뒤 CNNModel까지 구현했다.

#PyTorch #CNN #Conv2d #MaxPool2d #FeatureMap #load_digits #DeepLearning #딥러닝공부

⠀

1. load_digits 손글씨 데이터 불러오기

이번 실습에서는 sklearn의 load_digits() 데이터를 사용했다.

각 이미지는 8×8 크기의 흑백 손글씨 이미지이고, Target은 0~9 숫자 Class다.

⠀

2. Train / Test 데이터 분리

실행 결과는

Train → 1,437개
Test  → 360개

였다.

⠀

3. 사용자 정의 Dataset 만들기

digits.data는 각 이미지가 길이 64의 Vector로 들어 있기 때문에 __getitem__()에서 다시 8×8 형태로 바꾼 뒤 ToTensor()를 적용했다.

하나의 Feature Shape은

(1, 8, 8)

이며, 첫 번째 1은 흑백 Channel을 의미한다.

⠀

4. DataLoader로 Batch 만들기

한 Batch의 Shape은

(64, 1, 8, 8)

이다.

즉

(batch, color, row, column)

구조가 만들어진다.

⠀

5. Conv2d는 이미지에서 Feature Map을 만든다

in_channels=1은 흑백 이미지가 한 장의 Channel로 구성된다는 뜻이고,

out_channels=10은 Convolution을 통해 10개의 Feature Map을 만든다는 뜻이다.

실제 Batch

(64, 1, 8, 8)

를 Conv2d에 넣었을 때 출력 Shape은

(64, 10, 6, 6)

이었다.

Batch 수는 그대로이고, Feature Map이 10개로 늘어난 것을 확인할 수 있다.

⠀

6. MaxPool2d는 Feature Map의 크기를 줄인다

Pooling을 적용하면

Batch
Feature Map 개수

는 유지되고,

각 Feature Map의

Row
Column

크기만 줄어든다.

강의에서는 최근 CNN 구조에서 Max Pooling을 자주 사용하는 이유를, 강한 특징을 더 남기는 방식으로 설명했다.

평균을 내는 Average Pooling보다 눈에 띄는 값이 유지되기 쉽다는 관점이다.

⠀

7. ConvLayer 만들기

이번 모델에서는

Conv2d
↓
ReLU
↓
MaxPool2d

를 두 번 반복해 이미지에서 특징을 추출하고 압축했다.

⠀

8. DenseLayer는 최종 Target을 예측한다

ConvLayer와 Pooling은 이미지에서 Feature를 추출하고,

마지막 DenseLayer에서

Flatten
↓
Linear Layer
↓
Class Prediction

과정을 통해 0~9 Class를 예측한다.

⠀

9. ConvLayer + DenseLayer = CNNModel

 

즉 전체 CNN은

Image
↓
ConvLayer
↓
Feature 추출 / 압축
↓
DenseLayer
↓
Target Prediction

구조로 연결된다.

⠀

10. 학습과 평가

다중분류이므로 CrossEntropyLoss를 사용했고,

Adam Optimizer와 Early Stopping을 적용했다.

Best Model을 이용한 실행 결과에서

F1 Score ≈ 0.902

로 확인됐다.

⠀

11. 핵심 정리

개념기억할 내용

Conv2d 이미지의 주변 영역을 보면서 Feature Map 생성
out_channels 생성할 Feature Map의 개수
MaxPool2d Feature Map의 Row / Column 크기를 줄여 압축
ConvLayer Convolution + ReLU + Pooling을 반복하며 특징 추출
DenseLayer Flatten 후 Linear Layer로 최종 Class 예측
CNNModel ConvLayer와 DenseLayer를 하나의 모델로 연결
 
반응형