[5강] Convolutional Neural Network

Xpert·2021년 7월 13일
0

CS231n

목록 보기
6/6

CNN

Convolutional Neural Network. 다른 말로 합성곱 신경망이라고 부른다.
1차원을 가지고 연산하는 일반적인 방식과 달리, 입력이 3차원으로 구성된 신경망이라
Width x Height x Channel 형태의 이미지에 적합한 방식이다.

Filter

Convolution 연산을 수행하기 위해서는 입력 이미지보다 Width(W)와 Height(H)는 작지만, Depth(D)는 같은 크기를 가진 필터가 필요하다. 이러한 필터를 이미지 상에서 슬라이딩하며 합성곱 연산을 하게 될 것이다.

Convolution Operation


채널이 1인 4x4 이미지와 3x3 필터가 있다고 생각해보자.
필터는 좌상단부터 입력 이미지를 슬라이딩하며 합성곱 연산을 수행한다.
합성곱 연산이란, 서로 위치가 대응되는 픽셀 값 끼리 곱해준 뒤 그 값들을 모두 더해주는 것을 반복하는 연산이다.

위 이미지의 좌상단에 위치한 예시를 통해 직접 수행해보면 아래와 같은 결과가 나온다.

(01)+(10)+(71)+(51)+(52)+(60)+(53)+(30)+(31)=40(0*1) + (1*0) + (7*1) + (5*1) + (5*2) + (6*0) + (5*3) + (3*0) + (3*1) = 40

필터가 이미지의 모든 영역을 다 훑으며 연산을 수행한 결과, 2x2의 activation map이 산출되었다.
만일 채널이 1보다 큰 경우에는 각 채널 별로 나온 activation map끼리 모두 더해서 최종 activation map을 만든다.

그래서 예를들면 32x32x3 이미지에 5x5x3 필터를 사용하여 합성곱해주면, 28x28x1 activation map이 생겨난다.
기존 이미지보다 크기가 줄어드는 이유를 쉽게 떠올리려면, 합성곱 연산을 수행하며 결과로 나온 각 값들이 해당 필터 영역의 중앙에 찍힌다고 생각해볼 수 있다. 그러면 이미지의 상하좌우 2칸씩이 비게 되므로 28x28이 된다.
그리고 채널별로 나온 결과값을 모두 더하므로 activation map의 채널은 1이 될 것이다.

여러개의 필터

보통은 필터를 한개만 쓰지 않고, 여러 개의 필터를 겹쳐서 사용하는 경우가 많다.
6개의 필터를 사용한다면 위와 같이 6개의 activation map이 나올 것이다. 만약 각 필터가 가지고 있는 값들이 서로 다르다면, 각 map들도 모두 다른 값들을 가지고 있을 것이므로 다양한 특징(feature)을 뽑는 데에 유리하다.

Stride

합성곱 연산에 대해서 조금 더 살펴보자.
위에서 말했던 것처럼 연산을 수행할 때에는 전체 이미지를 슬라이딩하며 이동한다.
만약 이동하는 간격을 조금 더 늘리고 싶다면 stride를 바꿔줄 수 있다.
4x4이미지와 2x2 filter가 있다고 생각해보자.
stride=1이면 1칸씩 이동하며 총 9번의 연산을 수행하므로 결과는 3x3이 된다.
stride=2인 경우 2칸씩 이동하므로 총 4번의 연산을 수행하고 결과는 2x2가 된다.
즉 stride를 늘릴수록 activation map이 상대적으로 작아지는 것을 알 수 있다.

이를 공식화 하면 아래와 같다.

그리고 stride를 설정할 때는 너무 값을 크게 하지 않도록 주의해야 한다.
위와 같은 이미지에서 stride를 1이나 2로 잡는건 크게 문제되지 않는다. 그런데 만약 3으로 설정하면 공식에 의해 다음과 같은 결과가 나온다.
결과 map의 사이즈가 정수로 딱 떨어지지 않기 때문에 이미지의 일부 특징이 누락되어 원하지 않는 결과를 초래할 것이므로 주의할 필요가 있다.

Zero padding

입력 사이즈와 출력 사이즈를 동일하게 맞춰주고 싶을 수도 있다. 이때는 입력 이미지에 0으로 채워진 값들을 가장자리에 넣어서 연산을 수행해줄 수 있는데 이를 Zero padding 이라 한다.
또한 제로 패딩의 장점은 이미지의 가장자리 영역에서도 연산을 수행하여 특징을 추출할 수 있게 해준다는 점이다.

Pooling

풀링 연산은 feature map을 일종의 down-sample 하는 기법이다. Max pooling과 Average Pooling이 있는데 보통은 Max pooling을 많이 이용한다.
4x4 이미지를 2x2 filter를 사용하여 pooling을 한다면 위와 같이 이미지가 4개의 영역으로 나누어질 것이고, 각 영역에서 가장 큰 값을 취하여 feature map이 생성된다. 참고로 풀링에서는 딱히 stride를 주지 않아도 알아서 배타적으로 영역이 나뉘게 된다.

Fully Connected (FC)

FC는 완전 연결 계층으로서, 한 레이어의 모든 노드과 다른 레이어의 모든 노드에 영향을 주는 계층을 의미한다.

위에서는 입력층과 은닉층1, 은닉층1과 은닉층2가 서로 FC 상태임을 알 수 있다.

보통은 Convolution ⇒ Activation Function(Relu) ⇒ Pooling을 계속하여 feature map의 크기를 점점 줄여나가다가, 거의 마지막 단에서 1차원으로 flatten 한 후에 FC를 n번 수행해서 최종 score vector를 산출하는 것이 일반적인 CNN 기반 네트워크 구조이다.

위의 이미지는 Convolution 연산이 포함된 네트워크의 예시이다. 각 layer 별로 이미지에서 추출한 특징(feature) 이미지들을 볼 수 있다. 마지막 단에서는 1차원으로 flatten된 점수 벡터를 통해 해당 이미지를 car 라고 식별하였다.

profile
Python, CV, ML, Backend

0개의 댓글