elevne's Study Note

딥러닝 파이토치 교과서 (4-1: CNN Conv2d, MaxPool2d 계산) 본문

Machine Learning/Pytorch

딥러닝 파이토치 교과서 (4-1: CNN Conv2d, MaxPool2d 계산)

elevne 2023. 3. 6. 11:37

저번 시간에 Conv2d, MaxPool2d 를 사용하며 행렬의 크기를 계산할 필요가 있었는데, 이를 하는 방법에 대해서 알아보았다.

 

 

 

저번 실습에서 사용한 Fashion MNIST 데이터는 28 * 28 의 Gray Scale 이미지데이터였다. 데이터를 우선 Conv2d 에 넣게된다. Conv2d 에 대해서 다시 복습해보자면 이는 input data 의 채널 크기 (RGB 면 3, Gray Scale 이면 1) , output data 의 크기 (필터를 몇 장 만들 것인지) , Kernel size, Padding, Stride (default = 1) 값을 받게된다. 결과 사이즈는 위 값들을 사용하여 계산하게 된다. 수식은 아래와 같다.

 

 

 

 

 

 

 

저번 예제의 경우로 생각해보았을 때, 처음에 28 * 28 의 이미지를 넣게되면 (( 28 + 2 * 1 - 3 ) / 1) + 1 로 28 이 결과 값으로 나오게된다. 이는 위에서 확인할 수 있듯이 number of output features 의 값으로 output 의 shape 이 28 * 28 이 된다고 생각하면 되는 것이다. 저번 시간에 사용했던 예제 코드의 경우 Conv2d 의 인자 중 out_channels 를 32 로 설정하였기에 (32, 28, 28) 의 shape 이 최종적으로 나오게 되는 것이다.

 

 

 

그 다음으로는 MaxPool2d 를 거친 후를 계산해야 한다. 이는 훨씬 간단하다. MaxPool2d 의 인자로 넣은 값을 image shape 에서 나누면 되는 것이다. 예제를 예로 들자면 Conv2d 로 거쳐서 나온 결과의 shape 이 28 * 28 이고 MaxPool2d 는 2 를 인자로 받는다. 이러한 경우에는 14 * 14 즉 결과는 (32, 14, 14) 의 shape 을 가지게 되는 것이다.

 

 

 

저번 실습에서는 이러한 과정을 한 번 더 반복하였다. 두 번째 Conv Layer 에서는 out_channels = 64, kernel_size = 3 으로 지정하였다. 이를 (32, 14, 14) 로 계산해보면 ((14 + 2 * 0 - 3) / 1) + 1 = 12 로, (64, 12, 12) 가 나오게 된다. 그 다음 MaxPool2d 에서는 또다시 2 를 인자로 주었기에 최종적으로 (64, 6, 6) 의 shape 을 가지게 되는 것이고 이를 view 로 flatten 하여 Fully Connected Layer 을 구성한 것이다.

 

 

 

 

 

 

Reference:

https://teddylee777.github.io/pytorch/conv2d-output-size-%EA%B3%84%EC%82%B0%EB%B2%95/2