No Limitation
[Pytorch] Convolution Neural Network로 MNIST 분류 본문
본 포스팅은 유원준 님의 Pytorch로 시작하는 딥러닝 입문 교재를 참고했음을 밝힙니다
본 포스팅은 CNN에 대한 이론적인 내용은 따로 다루지 않으며
Pytorch에서 구현하는 코드 위주와 관련된 설명임을 밝힙니다
이론과 관련한 부분은 본 교재
다음을 참고하기 바랍니다.
우선 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 |