Home CNN 알고리즘
Post
Cancel

CNN 알고리즘

CNN의 개념

기존 Fully Connected Layer(;FC)로 구성된 인공 신경망 사용 시 3차원 데이터를 1차원으로 평면화 시키는 과정에서 공간 정보가 손실되어 성능을 높이는데 한계가 있었습니다.
이런 문제를 보완하여 이미지의 공간 정보를 유지한 상태로 학습 가능한 모델이 CNN(Convolutional Neural Network) 입니다.

기존 Fully Connected Neural Network와 비교 시 CNN의 차별성
FC와 CNN의 차이점에 대한 조금 더 자세한 설명

  • 각 레이어의 입출력 데이터의 형상 유지
  • 이미지의 공간 정보를 유지하면서 인접 이미지와의 특징을 효과적으로 인식
  • 복수의 필터로 이미지의 특징 추출 및 학습
  • 추출한 이미지의 특징을 모으고 강화하는 Pooling Layer
  • 필터를 공유 파라미터로 사용 하기 때문에 일반 인공 신경망과 비교하여 학습 파라미터가 매우 적음


img img CNN은 이미지의 특징을 추출하는 부분과 클래스를 분류하는 부분으로 나눌 수 있습니다.
특징 추출 영역은 Convolution Layer와 Pooling Layer를 여러 겹 쌓는 형태로 구성됩니다. 이 중 Convolution Layer는 입력 데이터에 필터를 적용 후 활성화 함수를 반영하는 필수 요소입니다. Pooling Layer는 선택적인 레이어입니다.
클래스 분류 영역은 Fully Connected Layer(Dense Layer; 신경망)로 이루어집니다. 그리고 특징 추출 부분과 분류 부분 사이에 이미지 형태의 데이터를 배열 형태로 만드는 Flatten Layer가 위치합니다.

CNN은 이미지 특징 추출을 위하여 입력데이터를 필터가 순회하며 합성곱을 계산하고, 그 계산 결과를 이용하여 Feature Map을 만듭니다. Convolution Layer는 Fiter 크기, Stride, Padding 적용 여부, Max Pooling 크기에 따라서 출력 데이터의 Shape이 변경됩니다.

이미지의 특징을 추출하는 과정을 Feature Extraction이라고 합니다. Deep Learning은 이미지로부터 Filter 개수 등의 하이퍼 파라미터(Hyperparameter)를 조절하여 특징 추출을 자동화 한 것이 강점입니다.


Convolution

합성곱 처리 절차
img

출처: 보기

인접한 Pixel에 Covolution Filter를 곱해 얻어진 Feature Map으로 이미지의 특징을 뽑을 수 있다.

Channel

컬러 사진은 색표현을 위해 RGB 3개의 실수를 사용하여 3개의 채널로 구성됩니다. 반면 흑백 사진의 경우 흑백의 명암만을 표현하기 때문에 1개 채널로 구성됩니다. 데이터의 Shape은 (높이, 폭, 채널)입니다.
img

Filter

CNN에서는 Kernel은 Filter와 같은 의미로, 일반적으로 (4,4)나 (3,3)과 같은 정사각 행렬로 정의됩니다. CNN에서 학습의 대상은 Filter 파라미터입니다.
Filter는 입력 데이터를 지정한 간격으로 순회하면서 합성곱을 계산합니다. 여기서 지정된 간격을 Stride라고 합니다.
입력 데이터가 여러 채널을 갖는 경우, Filter는 각 채널을 순회하며 합성곱을 계산한 후, 채널별 Feature Map을 만듭니다. 그리고 각 채널의 Feature Map을 합산하여 최종 Feature Map으로 반환합니다. 입력 데이터는 채널 수와 상관없이 Filter 별로 1개의 Feature Map이 만들어 집니다.

1개 Filter는 Feature Map의 채널이 됩니다. 따라서 Convolution Layer에 N개의 Filter가 적용된다면 출력 데이터는 N개의 채널을 갖게 됩니다.

  • 이미지의 특징을 추출하는 Filter의 종류와 기능은 다음과 같다.

    img*

일반적인 이미지 처리에서는 sobel Filter와 같이 유명한 Filter들을 직접 사용자가 찾아서 사용해야했지만, CNN은 신경망에서 학습을 통해 자동으로 적합한 필터를 생성해준다는 특징이 있습니다.

이 부분이 딥러닝에 의한 결과의 해석을 어렵게 만드는 부분 중 하나입니다. 정확히 어떤 Filter를 사용하여 어떤 Feature를 추출했는지 저는 알 수 없습니다.

Convolution Layer의 입력 데이터를 Filter가 순회하며 합성곱을 통해 만든 출력을 Feature Map 혹은 Activation Map이라고 합니다. Feature Map은 합성곱 계산으로 만들어진 행렬이며 Activation Map은 활성 함수를 적용한 결과입니다. 즉, Convolution Layer의 최종 출력 결과가 Activation Map입니다.

Padding

Convolution Layer에서 Filter와 Stride의 작용으로 Feature Map의 크기는 입력 데이터보다 Shape이 작아집니다. 이를 방지하기 위한 방법이 Padding입니다. Padding은 입력 데이터의 외각에 지정된 픽셀만큼 특정 값으로 채워 넣는 것을 의미하며 보통 0으로 채워 넣습니다.

img 출처: taewan.kim님의 블로그

Padding을 통해서 Convolution Layer의 출력 데이터 사이즈를 조절하는 기능 외에, 외각을 0값으로 둘러싸 인공 신경망이 이미지의 외각을 인식하는 학습 효과도 있습니다.

Pooling Layer

Pooling Layer는 Convolution Layer의 출력 데이터를 입력받아 출력 데이터(Activation Map)의 크기를 줄이거나 특정 데이터를 강조하는 용도로 사용됩니다. 만약 이미지의 크기를 줄이지 않고 Fully Connected Layer까지 가게 된다면 연산량이 기하급수적으로 늘어날 것입니다.
Pooling Layer를 처리하는 방법으로는 Max PoolingAverage Pooling, Min Pooling이 있습니다. 정사각 행렬의 특정 영역 안 값의 최댓값을 모으거나 평균을 구하는 방식으로 동작합니다. 일반적으로 Pooling 크기와 Stride를 같은 크기로 설정하여 모든 원소가 한 번씩 처리 되도록 설정합니다.

CNN에서 주로 Max Pooling을 사용하는 이유는 뉴런이 가장 큰 신호에 반응하는 것과 유사하다고 합니다. 이렇게 했을 때 노이즈가 감소하고 속도가 빨라지며 영상의 분별력이 좋아진다고 합니다.

img 출처: taewan.kim님의 블로그

CNN에서는 주로 Max Pooling을 사용하며 입력된 데이터가 Pooling Layer를 통과하면서 행렬의 크기가 감소하나 채널 수는 변하지 않습니다. 또한 학습대상 파라미터가 없습니다.

Flatten Layer

Flatten Layer는 CNN의 데이터 타입을 Fully Connected Neural Network의 형태로 변경하는 레이어입니다. (높이, 폭, 채널)의 형태를 (X, 1)의 형태로 바뀌어 줍니다. Flatten Layer에는 파라미터가 존재하지 않고, 입력 데이터의 Shape 변경만 수행합니다.

  • 입력 데이터 Shape (2,1,80)
  • 출력 데이터 Shape (160,1)

Layer 별 출력 데이터 크기 계산

입력 데이터에 대한 filter의 크기와 Stride 크기에 따라서 Feature Map의 크기가 결정됩니다.

NameWord
입력 데이터의 높이H
입력 데이터의 폭W
필터의 높이FH
필터의 폭FW
Stride 크기S
패딩 사이즈P


식1: 출력 데이터 크기 계산

\[OutputHeight = OH = {(H+2P-FH) \over S} +1\] \[OutputWeight = OW = {(W+2P-FW) \over S} +1\]

식1의 결과는 자연수가 되어야 하며 Convolution Layer 다음에 Pooling Layer가 온다면, Feature Map의 행과 열 크기는 Pooling 크기의 배수여야 합니다. 예를 들어 Pooling 사이즈가 (3,3)이라면 위 식의 결과는 자연수이며, 3의 배수여야 합니다. 이 조건을 만족하도록 Filter의 크기, Stride의 간격, Pooling 크기 및 패딩 크기를 조절해야합니다.

식2: Pooling Layer 출력 데이터 크기 산정

\[OutputRowSize = {InputRowSize \over PoolingSize}\] \[OutputColumnSize = {InputColumnSize \over PoolingSize}\]

일반적으로 Pooling 사이즈는 정사각형입니다. Pooling 사이즈를 Stride 크기와 같게 만들어서, 모든 요소가 한번씩 Pooling되도록 만듭니다. 입력 데이터의 행 크기와 열 크기는 Pooling 사이즈의 배수(나누어 떨어지는 수)여야 합니다. 결과적으로 Pooling Layer의 출력 데이터의 크기는 행과 열의 크기를 Pooling 사이즈로 나눈 몫입니다. Pooling 크기가 (2,2)라면 출력 데이터 크기는 입력 데이터의 행과 열 크기를 2로 나눈 몫입니다. Pooling 크기가 (3,3)이라면 입력 데이터의 행과 크기를 3으로 나눈 몫이 됩니다.


CNN 구성

img 출처: 보기

위 그림은 전형적인 CNN의 구성입니다. Convolution Layer와 Max Pooling Layer를 반복적으로 stack를 쌓아 특징을 추출하는 부분(Featuree Extraction)과 Fully Connected Layer를 구성하고 마지막에 출력층에 Softmax를 적용한 분류 부분으로 나뉩니다. CNN을 구성하면서 Filter, Stride, Padding을 조절하여 특징 추출 부분의 입력과 출력 크기를 계산하고 맞추는 작업이 중요합니다. 아래 코드는 위 그림을 Keras로 구현한 것입니다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
from keras.models import Sequential
from keras.layers.convolutional import Conv2D
from keras.layers.convolutional import MaxPooling2D
from keras.layers import Dense
from keras.layers import Flatten

model = Sequential()
model.add(Conv2D(12, kernel_size=(5, 5), activation='relu', input_shape=(120, 60, 1)))
model.add(MaxPooling2D(pool_size=(2, 2)))
model.add(Conv2D(16, kernel_size=(5, 5), activation='relu'))
model.add(MaxPooling2D(pool_size=(2, 2)))
model.add(Conv2D(20, kernel_size=(4, 4), activation='relu'))
model.add(MaxPooling2D(pool_size=(2, 2)))
model.add(Flatten())
model.add(Dense(512, activation='relu'))
model.add(Dense(128, activation='relu'))
model.add(Dense(4, activation='softmax'))

첫 Conv2D에서 (5,5) 크기인 12개의 Filter를 통해 2 Stride만큼 Convolution을 합니다. 그 이후 출력은 폭과 높이가 4(양 쪽 2만큼) 줄어들고 채널은 12개가 생성됩니다. 그리고 출력된 결과물을 가지고 (2,2)크기로 pooling을 진행합니다. 이렇게 3 단계에 걸쳐 Convolution을 진행하고, Fully Connected Layer에 넣기 위해 Flatten Layer로 데이터의 형태를 변형해줍니다.

CNN의 하이퍼파라미터

CNN의 파라미터로는 다음과 같습니다.

  • Convolution Filter의 개수
    각 Layer에서의 연산시간 & 연산량을 비교적 일정하게 유지하며 시스템의 균형을 맞추는 것이 좋습니다. 보통 Pooling Layer를 거치면 1/4로 출력이 줄어들기 때문에 Convolution Layer의 결과인 Feature Map의 개수를 4배정도 증가시키는 것이 좋습니다.

  • Filter의 사이즈
    작은 Filter를 여러 개 중첩하면 원하는 특징을 더 돋보이게 하면서 연산량을 줄일 수 있습니다. 요즘 대부분의 CNN은 3X3 size를 중첩해서 사용한다고 합니다.

  • Padding 여부
    Padding을 사용하면 입력 이미지의 크기를 줄이지 않을 수 있습니다.

    Padding Options

    • Valid: Padding 없이 입력보다 출력의 크기가 작아집니다.
    • Same: Padding으로 입력과 출력의 크기를 같게 합니다.
  • Stride
    Stride가 커지게 되면 결과 데이터의 사이즈가 작아지게 됩니다.




참고 자료

This post is licensed under CC BY 4.0 by the author.