Notice
Recent Posts
Recent Comments
«   2024/11   »
1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30
Tags
more
Archives
Today
Total
관리 메뉴

No Limitation

[Pytorch] Convolution Neural Network로 MNIST 분류 본문

ML & DL & RL

[Pytorch] Convolution Neural Network로 MNIST 분류

yesungcho 2022. 3. 1. 22:24

본 포스팅은 유원준 님의 Pytorch로 시작하는 딥러닝 입문 교재를 참고했음을 밝힙니다

https://wikidocs.net/63565

 

 

본 포스팅은 CNN에 대한 이론적인 내용은 따로 다루지 않으며

Pytorch에서 구현하는 코드 위주와 관련된 설명임을 밝힙니다

 

이론과 관련한 부분은 본 교재

https://wikidocs.net/62306

 

01. 합성곱과 풀링(Convolution and Pooling)

합성곱 신경망(Convolutional Neural Network)은 이미지 처리에 탁월한 성능을 보이는 신경망입니다. 이번 챕터에서는 합성곱 신경망에 대해서 학습합니다. ...

wikidocs.net

다음을 참고하기 바랍니다. 

 

 

우선 CNN에 들어가는 입력 형태를 가정해보면,

배치 크기 x 채널 x 높이 x 너비가 크기 형태가 되므로

우선, 흑백의 그림을 인식한다는 전제하에 채널은 1로 설정을 하고 

28 x 28의 입력을 받는 형태를 가정해보도록 하자. 

 

다음과 같이 입력 값들을 설정할 수 있다.

 

텐서 사이즈는 (1, 1, 28, 28)임을 확인할 수 있다.

 

이제 다음과 같이 설정한 입력을 합성곱 신경망 연산을 수행하는 과정을 거쳐보자

 

합성곱 연산은 nn.Conv2d 로 연산이 가능하며 max pooling의 경우 nn.MaxPool2d로 가능하다.

 

우선 입력을 32채널로 만들고 stride=1, kernel_size=3, padding=1로 설정한 합성곱 층을 통과하는 경우 다음과 같이 구성된다.

 

그리고 32 채널이 된 conv1을 수행한 결과를 다시 2번째 합성곱을 통과시키면 다음과 같다.

그리고 이를 맥스풀링을 하면 다음과 같다.

 

이는 예시일 뿐이고 일반적으로는

conv1 -> (활성화함수) -> (맥스풀링) -> conv2 -> (활성화함수) -> ... 이러한 아키텍처로 구성된다.

 

이를 수행하면 다음과 같다.

이 아웃풋을 배치 사이즈를 제외한 나머지를 펼치게 되면 다음과 같이 구축된다.

 

그리고 이 마지막 텐서를 fully connected layer에 통과시켜 10개의 뉴런을 배치해 10 차원의 텐서로 바꾸게 되면, 0~9의 손글씨 이미지를 분류하는 아키텍처로 만들 수 있다. 

 

 

이제 이러한 논리를 바탕으로 MNIST 손글씨를 분류해보자

 

라이브러리 및 데이터 로더 구축

 

밑작업이 완료되면 곧바로 CNN을 구현한다.

training을 수행해준다.

테스트 데이터에 대해 예측을 수행해준다

 

정확도가 98%가 나옴을 확인할 수 있다.