본문 바로가기

딥러닝/신경망 기초

Convolutional Neural Network(CNN)

Convolutional Neural Network(CNN)

 

이미지 분류에서 강력한 성능을 보이는 Convolutional Neural Network를 알아보자.

 

 

convolution?

하나의 함수와 또 다른 함수를 반전 이동한 값을 곱한 다음, 구간에 대해 적분하여 새로운 함수를 구하는 수학 연산자 (wikipedia)

: 쉽게 말해 원본이미지에 무언가를 곱해준다는 의미

: 즉, CNN은 이미지에 무언가를 계속 곱해주는 것으로 볼 수 있다. 좀 더 자세히 알아보자.

Convolution

 

가장 좌측의 이미지 데이터(array)가 가운데 3x3 filter를 통과하는데, 그냥 통과시키는게 아니라, 

Convolution, 즉 이 둘을 곱하여 하나의 값으로 출력한 convolution feature map을 출력해낸다.(가장 오른쪽)

 

좀 정리해서 말해보면,

filter(convolution kernel)는 이미지의 특정 패턴을 말하는데

이 filter image(convolution kernel)가 input으로 들어온 이미지를 쓰~윽 한번 훑으면서 곱해져(convolution) 

feature map이라는 걸 만들어 낸다.

convolution process

 


왜 이런 Convolution을 하는거지? 왜 하는거야...?

On the relatively small images that we were working with (e.g., 8x8 patches for the sparse autoencoder assignment, 28x28 images for the MNIST dataset), it was computationally feasible to learn features on the entire image. However, with larger images (e.g., 96x96 images) learning features that span the entire image (fully connected networks) is very computationally expensive

사이즈가 작은 이미지(MNIST 같은)에서는 그냥 fully connected network를 써도 계산하는데 무리가 없다.

하지만 이미지의 사이즈가 커지면 달라진다. 

 

사이즈가 커지면서 parameter인 weight의 갯수 또한 증가하게 되고,

fully connected network에서 forward/backpropagation의 계산량이 어마어마하게 커질 수 있다.

 

하나의 filter가 parameter가 되고 이것이 이미지에 공통적으로 적용되면서 parameter수를 줄이고, 계산량도 줄이는 장점이 있다.

 


Local Receptive Field

Local Receptive Field

filter는 input 이미지의 일부와 내적(곱)을 하여 하나의 값을 쭈~욱 뽑아낸다.

이때, filter와 곱해지는 input이미지의 일부를 receptive field라고 한다. (Local Receptive Field)

ex)

input의 일부, 5x5의 영역만 filter(5x5 weights)와 내적이 이루어진다.

이때, 다음 hidden layer의 크기는 (28-5+1) x (28-5+1) --> 24x24

사용된 parameter의 갯수는 5x5(weights) +1(bias) = 26개

 

filter의 갯수가 100개라면 parameter의 수는 5x5x100(weights) + 1x100(bias)

 


Pooling & Padding & Stride

 

1) Pooling

 

네트워크의 parameter의 개수나 연산량을 줄이기 위해 representation(feature map)의 spatial한 사이즈를 줄이는 것이다. 

: 간단히 말해 convolution결과로 나온 feature map의 크기를 줄이는데, 일부 영역을 하나의 값으로 만든다.

: 이는 오버피팅을 조절하는 효과도 가지고 있다

 

pooling layer

pooling 방식에는 여러가지가 있다.

Max pooling, Average pooling , L2-norm pooling 등 다른 연산으로 풀링할 수도 있다. 

Average 풀링은 과거에 많이 쓰였으나 최근에는 Max 풀링이 더 좋은 성능을 보이며 점차 쓰이지 않고 있다.

 

 

2) Padding

padding in convolution

 

위 그림을 다시 보자.

가장 좌측 이미지의 가장자리부분이 모두 0으로 되어있는 것을 볼 수 있다.

 

이는 가장자리 0을 제거하고 convolution을 하면, 

(5x5)이미지에서  (3x3)feature map이 나온다.

하지만, 이것은 가장자리 부분의 특성을 반영하지 못한다는 결점을 가지고 있어

이를 극복하기위해 가장자리에 0을 둘러주는 것이다.(zero-padding)

 

zero-padding을 사용할 때의 장점은, 출력 볼륨의 공간적 크기(가로/세로)를 조절할 수 있다는 것이다. 특히 입력 볼륨의 공간적 크기를 유지하고 싶은 경우 (입력의 가로/세로 = 출력의 가로/세로) 사용하게 된다.

 

3) Stride

 

stride 1 and stride 2

좌측은 stride=1인 경우이고, 우측은 stride=2인 경우다.

즉, 이미지의 좌측 상단부터 convolution을 한다고 했을때,

convolution후 오른쪽으로 몇 칸이동할 것이냐는 것이다.

 

좌측과 같이 3x3 convolution후 우측으로 1칸이동하면

overlapping 구간이 1과 2 두군데가 생기게 된다.(겹치는 구간)

우측은 2 하나 겹친다.

 

 

그래서 입력이미지의 convolution후 output의 크키는

(n_input + 2 x n_padding - n_filter) / n_stride + 1가 된다.

 

ex)

28x28 input, padding size 1, stride 1, 3x3 filter + max-pooling 이라면 최종 output의 크기는?

▶ (28 + 2x1 - 3) / 1 + 1 = 28 --> max-pooling 적용 --> 14

▶ 14x14

 


참고

http://deeplearning.stanford.edu/wiki/index.php/Feature_extraction_using_convolution

http://aikorea.org/cs231n/convolutional-networks/