No Limitation
[Pytorch] Convolution Neural Network로 MNIST 분류 본문
본 포스팅은 유원준 님의 Pytorch로 시작하는 딥러닝 입문 교재를 참고했음을 밝힙니다
본 포스팅은 CNN에 대한 이론적인 내용은 따로 다루지 않으며
Pytorch에서 구현하는 코드 위주와 관련된 설명임을 밝힙니다
이론과 관련한 부분은 본 교재
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%가 나옴을 확인할 수 있다.
'ML & DL & RL' 카테고리의 다른 글
[Pytorch] Torchtext 튜토리얼 - '영어' (0) | 2022.03.04 |
---|---|
[Pytorch] 자연어 처리 intro - 토큰화와 정수 인코딩 (0) | 2022.03.04 |
[Pytorch] 손글씨 분류 in ANN (0) | 2022.02.27 |
[Pytorch] XOR Perceptron 구현하기 (0) | 2022.02.21 |
[Pytorch] MNIST 데이터 분류하기 - 소프트맥스 회귀로 분류 (0) | 2022.02.11 |