기존 Fully Connected Neural Network 의 입력 데이터가 1차원 배열 형태로 한정된다. 따라서 이미지 데이터로 신경망을 학습시켜야 할 경우, 3차원 이미지데이터(RGB)를 1차원으로 평면화(Flatten) 시킨 후 모델에 입력해야 한다. 이 과정에서 이미지의 공간적 정보가 손실되어, 모델의 특징 추출 및 학습이 비효율적이고 정확도의 한계가 발생한다. 이미지를 그대로 입력으로 받음으로써, 공간적/지역적 정보를 그대로 유지한 상태로 학습을 가능하도록 한 모델이 CNN 이다.
구조
CNN 은 위 이미지와 같이 이미지의 특징을 추출하는 부분과 클래스를 분류하는 부분으로 나눌 수 있다. 특징 추출(Feature Extraction) 영역은 Convolution Layer, Pooling Payer를 여러 겹 쌓는 형태로 구성된다. CNN의 마지막 부분에는 이미지분류(Classification)를 위한 Fully Connected Layer를 적용한 후 softmax를 적용해주면 클래스 별로 분류되는 확률이 최종 출력값으로 나오게 된다.
Convolutional Layer(합성곱 계층)
이 계층에서는 이미지에 필터를 적용하여 Feature Map을 얻는다. 위 그림에서는 3 ✕ 32 ✕ 32 크기의 이미지에 3 ✕ 5 ✕ 5 크기의 필터를 적용하여 1 ✕ 28 ✕ 28 크기의 Activation Map 을 생성하였다. 여기서 3은 채널 수(Channel 혹은 Depth)이며, 이미지가 RGB 이기 때문에 3이고, 흑백인 경우 1이 된다.
쉽게 말해서, 필터를 이미지의 맨 왼쪽 위에 가져다 댄 후 내적하면 숫자 하나가 나오고 그 값이 Activation Map 의 맨 왼쪽 위의 값으로 들어가게 된다. 그래서 결과로 나오는 Activation Map 의 크기가 32 - 5 + 1 = 28 이 되는 것이다.
이러한 결과 값을 Feature Map 또는 Activation Map 이라고 부른다. 이 때, 특징을 여러개 뽑기 위해서 여러 개의 필터를 사용하고, 여러개의 Activation Map 이 생성된다.
보통은 필터가 이미지 기준으로 한 칸씩 이동하며 계산을 하지만 여러 칸씩 이동이 가능하다. 위 그림에서는 두 칸씩 이동하면서 연산하도록 파라미터를 통해 조절할 수 있다.
입력 이미지의 가장자리에 측정 값으로 설정된 픽셀들을 추가함으로써 입력 이미지와 출력 이미지의 크기를 같거나 비슷하게 만드는 역할을 수행한다. 0의 값을 갖는 픽셀을 추가하는 것을 zero-padding 이라고 하며, CNN 에서는 주로 zero-padding 이 사용된다.
Pooling Layer
Pooling 계층에서는 이전 합성곱 과정을 통해 생성한 결과(Feature Map)에서 비교적 상관관계가 낮은 부분은 삭제함으로써 차원을 줄이는 과정을 수행한다. Pooling 에는 대표적으로 Max Pooling 과 Average Pooling이 있다. 위 이미지와 같이 선택 영역의 크기가 2 ✕ 2인 경우 해당 크기의 행렬에서 가장 큰 값(Max) 이나 평균값(Avaerage)을 취해서 Feature Map의 크기를 반으로 줄여준다.
선택 영역의 내부에서는 객체의 이동이나 회전에 의해 픽셀의 위치가 변경되더라도 출력값이 동일하기 때문에 객체가 이동이나 화전하더라도 같은 객체로 인식할 수 있다. 또한 모델이 처리해야 하는 이미지의 크기가 줄어들기 때문에 모델 파라미터 수가 줄어들어 학습시간을 크게 절약할 수 있다.