이번 챕터에서는 합성곱 신경망의 기본 개념과 합성곱, 풀링 계산방법에 대해서 다뤄보겠습니다.
합성곱(convolution)
- 밀집층과 비슷하게 입력과 가중치를 곱하고 절편을 더하는 선형 계산
- 밀집층과 달리 입력 데이터의 일부에 가중치를 곱함
7장에서 다룬 밀집층에는 뉴런마다 입력 개수만큼의 가중치가 있습니다. 모든 입력에 각각의 가중치()를 곱하고 절편()을 더해서 출력값을 도출합니다.
그리고 에포크를 반복하면서 경사 하강법 알고리즘을 사용하여 손실함수가 낮아지도록 최적의 가중치와 절편을 찾는 방식으로 모델을 훈련합니다.
합성곱은 밀집층과 달리 일부에 가중치를 곱합니다. 위의 예시를 보면, 합성곱 층의 뉴런은 3개의 가중치를 가집니다. ~의 가중치를 첫 번째, 두 번째, 세 번째 특성에 각각 곱하고 절편을 더해 1개의 출력을 구합니다.
그 다음 아래로 한칸 이동해서 두 번째부터 네 번재 특성에 가중치를 곱하고 절편을 더해 또 다른 출력을 만듭니다. 한 칸 씩 아래로 이동하면서 이 과정을 반복해서 모두 8개의 출력을 만듭니다.
밀집층의 뉴런은 입력 개수만큼 10개의 가중치를 가지고 1개의 출력을 만들었습니다. 하지만 위 그림처럼 합성곱 층의 뉴런은 3개의 가중치를 가지고 8개의 출력을 만들었습니다. 여기서 가중치의 개수는 하이퍼파라미터입니다.
필터(Filter), 커널(Kernel)
- 합성곱 신경망의 뉴런
- 뉴런 = 필터 = 커널
케라스 API
- 커널: 입력에 곱하는 가중치
- 필터: 뉴런 개수
이번에는 입력 데이터가 2차원인 경우에 대해서 살펴보겠습니다.
커널 크기를 (3, 3)으로 정의한다면, 합성곱은 가장왼쪽 위부터 시작해서 오른쪽 하단까지 한칸씩 이동합니다. 위 그림의 경우 필터가 4번 이동하면서 총 4개의 출력이 만들어집니다.
4개의 출력을 필터가 입력에 놓인 위치에 맞게 2차원으로 배열해서 (2, 2) 크기로 표현합니다. 이렇듯 합성곱 계산을 통해 얻은 출력을 특성맵이라고 합니다.
특성맵(feature map)
- 합성곱 계산을 통해 얻은 출력
합성곱에서 여러 개의 필터를 사용할 수도 있습니다. 아래 그림에서는 (3, 3) 크기의 필터를 3개 사용하여 최종적으로 (2, 2, 3) 크기의 3차원 배열 특성맵을 만듭니다.
케라스에서 제공하는 층은 keras.layers 패키지 아래 클래스로 구현되어 있습니다.
from tensorflow import keras
keras.layers.Conv2D(10, kernel_size=(3, 3), activateion='relu')
합성곱은 Conv2D 클래스입니다. 첫번 째 매개변수인 10은 필터의 개수입니다. kernel_size는 필터에 사용할 커널의 크기를 지정합니다.
패딩(Padding)
- 입력 배열의 주위를 가상의 원소로 채우는 것
(4, 4) 크기의 입력에 (3, 3) 크기의 커널을 적용하면 (2, 2) 크기의 특성맵이 만들어집니다. 그런데 만일 커널 크기를 (3, 3)으로 유지하면서 특성맵의 크기를 입력과 동일한 (4, 4) 배열로 만들려면 어떻게 해야할까요?
위 그림처럼 입력 배열 주위를 가상의 원소로 채워서 (6, 6) 크기로 만들면 (3, 3) 크기의 커널을 적용했을 때 (4, 4)의 특성맵을 만들 수 있습니다.
이 때, 0으로 가상의 원소를 채우는 것을 패딩 기법이라고 합니다.
세임 패딩(same padding)
- 입력과 특성맵의 크기를 동일하게 만들기 위해서 입력 배열 주위에 0으로 패딩하는 기법
밸리드 패딩(valid padding)
- 패딩 없이 순수한 입력 배열에서만 합성곱을 하여 특성 맵을 만드는 경우
이렇듯 패딩을 적용하는 이유는 모서리에 있는 특성 정보가 특성 맵에 잘 전달될 수 있도록 하기 위함입니다. 적절한 패딩은 이미지의 주변 정보를 잃어버리지 않도록 도와줍니다.
keras.layers.Conv2D(10, kernel_size=(3, 3), activation='relu', padding='same')
스트라이드(stride)
- 합성곱 층에서 필터가 입력 위를 이동하는 크기로 기본으로 스트라이드는 1픽셀, 즉 한 칸씩 이동함
keras.layers.Conv2D(10, kernel_size=(3, 3), activation='relu', padding='same', strides=1)
풀링(pooling)
- 합성곱 층에서 만든 특성 맵의 가로세로 크기를 줄이는 역할을 수행하며 특성맵의 개수는 줄이지 않음
- 가중치가 없는 특성 맵에서 최댓값이나 평균값을 선택
풀링도 합성곱처럼 입력 위를 지나가면서 출력값을 만들어냅니다.
위 그림에서는 (2, 2, 3) 크기의 특성 맵에 대해 (2, 2) 크기의 풀링을 적용해서 (1, 1, 3) 특성 맵을 최종적으로 만듭니다.
최대풀링(max pooling)
- 풀링할 때 가장 큰 값을 고름
평균풀링(average pooling)
- 풀링할 때 평균값을 출력
위의 그림은 최대풀링을 적용한 결과입니다. (2, 2) 크기의 풀링이 특성맵을 지나가면서 각 영역에서 가장 큰 값만을 골라서 저장합니다.
keras.layers.MaxPooling2D(2, stride=2, padding='valid')
합성곱 층과 마찬가지로 풀링의 크기, 스트라이드, 패딩을 지정할 수 있습니다.
AveragePooling2D 클래스에서 평균 풀링을 제공합니다.
합성곱 신경망(CNN)의 전체 구조를 그림을 기반으로 간략히 설명하면 다음과 같습니다.
1) 합성곱 층(Convolutional Layer)
2)풀링 층(Pooling Layer)
3)완전 연결 층(Fully Connected Layer)
자료 출처: 한빛 미디어