상세 컨텐츠

본문 제목

[Dive into Deep Learning / CNN] Fully connected layer / pooling layer

심화 스터디/Dive into Deep Learning

by yoowoohyuk 2022. 11. 13. 23:57

본문

작성자: 16기 유우혁

 

본 포스팅은 다음 자료들을 참고하여 작성되었습니다.

 

- https://www.youtube.com/watch?v=bNb2fEVKeEo&list=PL3FW7Lu3i5JvHM8ljYj-zLfQRF3EO8sYv&index=5

- https://d2l.ai/chapter_convolutional-neural-networks/index.html

- deep learning with pytorch

 


1. Fully connected layer란?

 

다차원으로 이루어진 layer를 1차원으로 펼치는 layer다.

이미지는 다차원 공간에 담겨서 픽셀값들이 전달되게 된다. CNN을 통해서 결과적으로 이미지들을 분류하는 작업을 진행하는데, 이때 이러한 다차원 값들을 1차원 벡터로 펼쳐줘야 한다. 그래서 fully connected layer를 통해 다차원으로 존재하는 값들을 1차원 벡터로 전부 연결시켜서 값들을 보존시킨다. 이렇게 벡터로 펼쳐진 값들은 활성화 함수나 softmax를 적용하여 원하는 결과를 도출한다. 

 

 

2차원 픽셀 값들을 1차원 벡터로 펼친 후 다른 layer와 함수를 거쳐 분류 작업하는 과정이다.

 

 

위의 사진에서 볼 수 있듯이 4 * 4행렬로 존재하는 값들을 16 * 1벡터로 펼쳐서 행렬에 존재하는 모든 값들을 벡터에 연결시켜준다. 그 후 여러 함수를 거쳐 개와 사람을 분류하는 것을 볼 수 있다. 

 

 

nn모듈에 있는 Flatten함수를 통해 Fully connected layer를 실현하는 모습이다.

 

 

파이토치에서도 이러한 기능을 구현해 놓았다. 위의 sequential과정을 보면 Max-pooling을 통해 전달된 값을 Flatten으로 펼친 후 Linear를 통해 결과 값을 출력하는 것을 볼 수 있다. 

 

 

32 * 32 * 3크기의 이미지를 1 * 3072 벡터로 펼친 후 1 * 10 크기의 벡터로 변환하기 위해 10 * 3072 크기의 가중치가 필요하다는 것을 보여준다.

 

 

AlexNet에서 convolution과 pooling과정을 거친 후 fully connected layer를 통해 1차원으로 flatten시키는 것을 볼 수 있다.

 

 

2. pooling layer란?

 

이미지의 크기가 매우 클 경우 작은 kernel을 가지고 CNN을 진행시키면 과도하게 많은 parameter가 발생하는 등의 문제가 발생할 수 있다. 그래서 pooling layer를 통해 convolution을 진행하면서 발생한 위치에 따른 민감성을 완화시키고downsampling을 시켜 큰 이미지의 크기를 줄여나갈 수 있도록 하였다.

pooling layer는 다른 kernel들 처럼 input으로 들어온 이미지를 stride에 맞게 움직이며 값을 뽑아낸다. 하지만 kernel과 다른 점은 파라미터를 가지고 값들을 뽑는 것이 아니라 고정된 함수를 이용하여 값들을 뽑는다는 것이다. 그 중 pooling에서는 두가지 방식이 가장 유명하다

 

  •  average-pooling : pooling window에 들어간 값들의 평균 값을 계산하여 뽑아내는 것이다. 하지만 오래된 방식으로 잘 쓰지 않는다고 한다.

 

  • max-pooling : 최근 가장 자주 쓰이는 pooling 방식이라고 한다. max-pooling에서는 pooling window에 들어간 값들 중 가장 큰 값을 뽑아낸다. 큰 값을 제외한 다른 값들을 사라지는 것이 단점이라고 할 수 있다. 

 

 

2*2 크기의 window를 움직이면서 값들을 뽑아내고 있다.

 

 

위의 그림에서 4 * 4 사이즈의 input이 2 * 2 pooling layer를 거쳐 2 * 2 사이즈로 작아진 것을 볼 수 있다. 여기서는 max-pooling을 통해 output을 도출한 것을 볼 수 있다. 이처럼 2 * 2 pooling을 통해 input의 크기를 절반으로 줄 일 수 있다. 

 

 

pytorch에서 MaxPool2d에서 2*2 크기의 max-pooling을 통해 이미지의 크기를 절반으로 줄인 것을 확인할 수 있다.

 

convolution, max-pooling과 flatten을 거쳐 1차원 벡터로 전환된 모습이다

 

위의 그림을 통해 kernel들을 거쳐 얻어진 값들이 max-pooling을 통해 작아지고 fully connected layer를 통해 1차원 벡터로 변환된 것을 확인할 수 있다. 

 

 

 

관련글 더보기

댓글 영역