산 넘어 산 개발일지

[CS231n - Lecture 5] Convolutional Neural Network 본문

머신러닝&딥러닝/cs231n

[CS231n - Lecture 5] Convolutional Neural Network

Mountain96 2021. 7. 28. 15:27

Fully Connected Layer (FC layer)

  Fully Connect Layer(이하 FC layer)는 보통 CNN 모델들의 마지막 분류기에서 사용된다. 보통 W라는 가중치에서 한 줄의 원소들이 모두 input 원소들과 곱해져 하나의 activation 노드를 형성하기 때문에 Fully-Connected(모두 연결된)이라는 용어를 쓰는 것 같다. W라는 가중치는 input -> output으로 만들어주므로 당연히 그 사이즈는 (inputSize x outputSize) 이다. 이를 통해, activation 노드 하나는 W의 특정한 가중치를 통해 input 전체를 본다고 할 수 있겠다.


Convolution Layer

  Convolution Layer는 한 이미지를 필터들을 통해 연산을 하여 output을 출력하는 층이다. 위 예시에서는 높이=32, 너비=32, 깊이(depth)=3인 이미지와, 높이=5, 너비=5, 깊이=3인 필터를 예시로 든다. 이 때, 필터의 깊이 = 이미지의 깊이 임을 주목하자. 즉 필터는 한 번에 모든 깊이를 보면서 돌아야 하기 때문에, 서로의 깊이가 같아야 하는 것이다.

  필터는 input image를 차례차례 돌면서 필터의 크기부분을 잘라내서 관찰한다. 관찰한다는 것은 필터의 가중치와 잘라낸 부분끼리의 스칼라곱(dot product)을 연산하고, bias를 더해주어서 하나의 값으로 나타낸다는 뜻이다. 이렇게 구한 값들 여러개를 붙여서 하나의 activation map을 구성한다.

  우측에 보이는 6겹의 activation map들 중 한 겹이 우리가 위에서 구한 하나의 activaiton map이다. 하나의 필터로 activation map 하나를 구했으므로, 사용하는 필터의 개수에 따라 출력하는 activation map의 개수가 달라진다는 것을 알 수 있다. 즉 필터의 개수 = activation map 개수 인 것이다. 이렇게 구한 activation map들의 한 덩어리가 output이 되어 새로운 이미지가 된다. 이를 다음 레이어에 전달하기까지가 Convolution layer의 역할이다.

 

  ※ 필터를 여러 개 사용하는 이유

     각 필터는 서로 다른 값들을 사용한다. 다시 말하자면, 각 필터마다 서로 다른 특징을 추출하기 때문에 다양한 특징을 추출하고자 여러 개의 필터를 사용하여 다양한 activation map들을 만드는 것이다.

 

  앞서 봤던 Convolution layer들을 연달아서 사용하면 위와 같은 변화가 생길 수 있다.

 

  위 슬라이드에서는 각 layer의 filter들 마다 어떤 feature들을 잡아내는지를 보여준다. 보면 알 수 있듯이,  각 필터들은 서로 다른 특징들을 추출해내며, layer가 깊어질 수록 더 추상적이고 high-level feature들을 추출해낸다.

 

  ※추가

     FC layer 와 Conv layer의 차이점

       FC layer는 전체적인 정보에 대해 연산하는 반면, Conv layer는 필터에 의한 지역적인 정보에 대해 연산한다.


Filter

  이제 필터가 어떻게 움직이는지를 알아보자. 위 예시는 7x7 input image에 3x3필터를 적용했을 때의 예시이다. 이를 Stride=1로 설정하고 다음으로 움직이면

  다음과 같이 1만큼 우측으로 이동한다. 여기서 알 수 있듯이, Stride는 한 번에 움직이는 거리를 뜻한다. 우측 끝까지 움직였다면, 다시 좌측 끝으로 이동한 뒤에 Stride 값 만큼 아래로 이동한다. 그러나 만약 Stride=3으로 설정하면 필터는 어떻게 움직일까?

  Stride=3이면 1~3행, 4~6행은 필터가 관찰할 수 있지만, 7행부터는 image size의 제한 때문에 그 너머로 움직일 수 없다. 따라서 7x7 input image에 3x3필터와 stride=3을 적용할 수는 없는 것이다.(공백이 생기므로)

  앞서 말한 것처럼, 필터는 한 구역을 관찰하면 스칼라곱 연산과 bias를 통해 하나의 값을 출력해낸다. 이 값들은 뭉쳐서 하나의 activation map을 형성한다. 따라서 필터가 관찰하는 구역의 개수가 곧 activation map의 size가 되는 것이다. 이 size는 위 식에서처럼 (N - F) / stride + 1로 구할 수 있다. 쉽게 풀어쓰자면, ((inputSize - filterSize) / stride) + 1 이다. 이 때, 보통 input size는 너비와 높이가 같은 정방행렬과 같은 크기로 주어지므로 딱히 구분하지는 않았지만, 만약 높이와 너비가 다르다면 그에 따라 구분하여 계산해야 할 것이다.


Zero-Padding

 

  사람들은 input image의 가장자리에 0을 채워서 사이즈를 인위적으로 늘려주기도 한다. 이를 zero-padding이라 하는데, padding을 하는 이유는 다음과 같다.

  1. input image의 가장자리 픽셀은 다른 픽셀들에 비해 필터에게 관찰(연산)되는 횟수가 적고, 이 때문에 출력에 미치는 영향이 상대적으로 적다. 그렇기 때문에 가장자리에 의미없는 0을 추가하여, 기존의 가장자리 픽셀들이 더 자주 관찰에 포함되도록 하는 것이다.
  2. zero-padding을 통해 Convolution layer들을 거치면서도 이미지의 size를 보존할 수 있다. size를 보존한다는 것은 그만큼 정보의 손실을 막는다는 것을 뜻한다. 따라서 정보의 손실을 억제하는 효과가 있다.

위와 같은 이유로 zero-padding을 해준다. 가장 큰 장점으로는 size를 보존하여 정보의 손실을 최소화한다는 점이 있지만, 이는 그만큼 연산량의 증가로 인한 단점도 가지고 있다.

 

  ※ 추가

     주로 사용되는 필터와 stride의 조합으로는 (3x3 with Stride 1), (5x5 with Stride 2), (7x7 with Stride 3)이 있다.

  zero-padding을 사용했을 시 출력되는 output의 size이다. 위, 아래, 좌측, 우측에 0을 끼워넣은 만큼 식에 2*padding이 추가되었다. 

  • (N - F + 2P) / S + 1

이를 쉽게 바꾸어 쓰면

  • (inputSize - filterSize + 2padding) / Strie + 1

이 된다.


Pooling layer

  Pooling은 슬라이드에서 보는 것처럼 이미지의 사이즈를 줄이는(downsampling)역할을 한다. 이에 따른 효과는 다음과 같다.

  • 파라미터 수 감소로 인한 연산량 감소(+ 쉬운 관리)
  • 공간적인 불변성 획득

  MaxPooling은 각 구역에서 가장 큰 값들만 뽑아내어 새로운 출력을 만드는 것이다. Pooling에서도 필터가 등장하는데, 필터가 움직이면서 필터 영역 내에서 가장 큰 값을 출력하게 된다. 이 때, 보통 stride는 필터의 사이즈를 따른다. 즉 중복되는 픽셀이 없도록 조정된다. 


출처 : https://www.youtube.com/c/stanfordengineering/featured

 

Stanford University School of Engineering - YouTube

 

www.youtube.com

 

Comments