합성곱 신경망(convolutional neural network, CNN)은 이미지 인식과 음성 인식 등 다양한 곳에서 사용되며, 특히 이미지 인식 분야에서 딥러닝을 활용한 기법은 거의 다 CNN을 기초로 한다.
CNN에서는 합성곱 계층(convolutional layer)과 풀링 계층(pooling layer)이 새롭게 등장을 한다.
기존의 신경망은 그림 1과 같이 완전 연결 신경망은 Affime 계층 뒤에 활성화 함수(Relu or Sigmoid)를 갖는 구조이다.
CNN 계층은 Conv-ReLU-(Pooling) 흐름으로 연결된다(풀링 계층은 생략하기도 한다).
합성곱 계층에서의 합성곱 연산을 처리한다. 합성곱 연산은 이미지 처리에서 말하는 필터 연산에 해당한다.
그림 3과 같이 합성곱 연산은 입력 데이터에 필터를 적용한다. 이 예에서는 입력 데이터는 세로 x 가로 방향의 형상을 가졌고, 필터 역시 세로 x 가로 방향의 차원을 갖는다. 데이터와 필터의 형상을 (높이 height, 너비 width)로 표기하며, 이 예에서는 입력은 (4,4), 필터는 (3,3), 출력은 (2,2)가 된다. 필터를 커널이라 칭하기도 한다.
완전 연결 신경망에는 가중치 매개변수와 편향이 존재하는데 CNN에서는 필터의 매개변수가 가중치이다. 그리고 CNN에도 편향이 존재한다. 편향까지 포함하면 그림 5와 같다. 편향은 필터를 적용한 후의 데이터에 더해진다. 편향은 1 x 1만 존재한다.
합성곱 연산을 수행하기 전에 입력 데이터 주변을 특정 값(예컨대 0)으로 채우기도 한다. 이를 패딩(padding)이라 하며, 합성곱에서 자주 이용하는 기법이다.
그림 6과 같이 (4,4) 크기의 입력 데이터에 폭이 1인 패딩을 적용한 모습이다. 폭 1짜리 패딩이라 하면 입력 데이터 사방 1픽셀을 특정 값으로 채우는 것이다.
패딩은 주로 출력 크기를 조정할 목적으로 사용한다. 예를 들어 (4,4) 입력 데이터에 (3,3) 필터를 적용하면 (2,2)가 되어 입력보다 2만큼 줄어들었다. 이는 합성곱 연산을 몇 번이나 되풀이하는 심층 신경망에서는 어느 시점에서는 출력 크기가 1이 된다. 즉, 더 이상 합성곱 연산을 적용할 수 없다. 이러한 사태를 막기 위해 패딩을 사용한다. 입력 데이터의 공간적 크기를 고정한 채로 다음 계층에 전달할 수 있다.
필터를 적용하는 위치의 간격을 스트라이드(stride)라고 한다. 지금까지 본 예는 모두 스트라이드가 1이었지만, 예를 들어 스트라이드를 2로 하면 필터를 적용하는 윈도우가 두 칸씩 이동한다.
(7, 7)인 입력 데이터에 스트라이드를 2로 하니 출력은 (3,3)이 된다. 즉, 스트라이드를 크게 설정하면 출력 크기가 작아진다. 한편 패딩을 크게하면 출력크기가 커졌다.
지금까지 설명한 특징 맵(Feature Map), 필터(Filter = Kernel), 패딩(Padding), 스트라이드(Stride) 사이의 관계를 이용하여, 출력 크기를 수식으로 표현하면 다음과 같다.
딥러닝 프레임워크 중에는 값이 딱 나눠떨어지지 않을 때는 가장 가까운 정수로 반올림한다.
지금까지는 2차원 형상을 다루는 합성곱 연산을 봤지만 이미지만 해도 세로, 가로에 더해 채널까지 고려한 3차원 데이터이다. 이번에는 3차원 데이터를 다루는 합성곱 연산을 본다.
3차원의 합성곱 연산에서 주의할 점은 입력 데이터의 채널 수와 필터의 채널 수가 같아야한다. 한편 필터 자체크기는 원하는 값으로 설정할 수 있다.(단, 모든 채널의 필터가 같은 크기여야한다.) 예를 들어 예제에서는 (3,3)이지만, 원한다면 (5,5),(2,2),(1,1) 등으로 설정이 가능하다.
3차원의 합성곱 연산은 데이터와 필터를 직육면체 블록으로 생각하면 쉽다.
3차원 데이터를 다차원 배열로 나타낼 때는 채널(channel), 높이(height), 너비(width) 순서로 쓴다. 예를 들어 채널 수 C, 높이 H, 너비 W인 데이터 형상은 (C, H, W)로 쓴다. 필터도 같은 순서로 쓴다. 예를 들어 채널 수 C, 필터 높이 FH, 필터 너비 FW의 경우 (C, FH, FW)로 쓴다.
위 예시에서 출력 데이터는 한 장의 특징 맵(Feature Map)이다. 그렇다면 만약 합성곱 연산의 출력으로 다수의 채널을 내보내고자 한다면 어떻게 해야 할까? 그럴 때는 아래 그림과 같이 다수의 필터("가중치"를 의미)를 사용하면 된다.
합성곱 연산에서는 필터의 수도 고려해야 한다. 그런 이유로 필터의 가중치 데이터는 4차원 데이터이며 (출력 채널 수, 입력 채널 수, 높이, 너비) 순으로 쓴다
여기에 편향까지 고려하고 싶다면 다음과 같이 합성곱 연산을 수행할 수 있겠다.
합성곱 연산에서도 배치 처리를 할 수 있다. 각 계층을 흐르는 데이터의 차원을 하나 늘려 4차원 데이터로 저장한다. 구체적으로는 (데이터 수, 채널 수, 높이,너비) 순으로 저장한다.
여기에서 주의할 점으로는 신경망에 4차원 데이터가 하나 흐를 때마다 데이터 N개에 대한 합성곱 연산이 이뤄진다. 즉 N회 분의 처리를 한번에 수행하는 것이다.
풀링은 세로,가로 방향의 공간을 줄이는 연산이다.
그림 13과 같이 2 x 2 영역을 원소 하나로 집약하여 공간의 크기를 줄인다. max pooling을 스트라이드 2로 처리하는 순서이다. max pooling은 최댓값을 구하는 연산이며 2 X 2 크기 영역에서 가장 큰 원소 하나를 꺼낸다. 또한 스트라이드위의 예에서 2로 설정했으므로 2x2윈도우가 2칸 간격으로 이동한다. 참고로 풀링의 윈도우 크기와 스트라이드는 같은 값으로 설정하는 것이 보통이다.
풀링은 max pooling 외에도 average pooling등이 있다. 영역에서 평균을 계산한다. 이미지 인식 분야에서는 주로 max pooling을 사용한다.
참조
[밑바닥부터 시작하는 딥러닝 1] Ch 7. 합성곱 신경망(CNN)
이미지 인식 분야에서 딥러닝을 활용한 기법은 거의 다 합성곱 신경망(CNN)을 기초로 한다. 그렇다면 합성곱 신경망. 즉, CNN이란 무엇일까? 이번 포스팅에서는 CNN에 대해 정리해보도록 하겠다. CNN
data-scientist-brian-kim.tistory.com
밑바닥부터 시작하는 딥러닝 - 7장 CNN
Chapter 7. 합성곱 신경망(CNN) 7.1 전체 구조 CNN에서는 새로운 합성곱 계층과 풀링 계층이 추가된다. CNN 계층은 conc-relu-pooling 흐름으로 연결된다. 여기서 중요한 것은 출력에 가까운 층에서는 affine-re
velog.io
YOLOv4: Optimal Speed and Accuracy of Object Detection (0) | 2023.03.24 |
---|---|
DETR : End-to-End Object Detection with Transformers (0) | 2023.01.15 |
hand-crafted features 와 End to end 차이점 (0) | 2021.10.01 |
댓글 영역