합성곱 신경망의 구성 요소


💡 합성곱 신경망(Convolution Neural Network, CNN)

1개 이상의 합성곱 층을 쓴 인공 신경망

입력 데이터 전체에 가중치를 적용하는 것이 아니라 일부에 가중치를 곱한다.

합성곱 층의 뉴런에 있는 가중치 개수는 정하기 나름이다.

CNN에서는 뉴런을 필터 혹은 커널이라고 부른다.

보통 커널은 입력에 곱하는 가중치이고, 필터는 뉴런 개수를 표현할 때 사용된다.

합성곱의 장점은 1차원이 아니라 2차원 입력에도 적용할 수 있다는 점이다.

그리고 총 4번을 움직이기 때문에 4개의 값을 출력한다.

그리고 합성곱 계산을 통해 얻은 출력을 특성 맵(feature map)이라고 부른다.

일반적으로 특성 맵은 활성화 함수를 통과한 값을 나타낸다.


밀집층에서 여러 개의 뉴런을 사용하듯이 합성곱 층에서도 여러 개의 필터를 사용할 수 있다.

그리고 각 필터의 커널은 모두 다른 값을 가진다.



💡 Keras에서의 CNN

합성곱 층은 Conv2D 클래스로 사용할 수 있다.

Conv2D 클래스의 몇 가지 매개변수를 가지고 있다.

▪ 필터의 개수

▪ kernel_size : 보통 (3,3) or (5,5)

▪ activaion function

▪ padding default:'valid'

▪ stride default:1

from tensorflow import keras

keras.layers.Conv2D(10, kernel_size=(3,3), activation='relu')


💡 패딩과 스트라이드

패딩(Padding)

입력 배열 주변을 가상의 원소로 채우는 것.

패딩의 역할은 순전히 커널이 필터를 찍을 횟수를 늘려주는 것밖에는 없다.

패딩은 실제 입력 값이 아니기 때문에 0으로 채워줘야 한다. 그리고 계산에

영향을 미치지 않는다.

아래의 그림처럼 입력과 특성 맵의 크기동일하게 만들기 위해 입력 주위에

0으로 패딩 하는 것을 Same Padding이라고 한다.

일반적인 합성곱 신경망에는 Same Padding이 많이 사용된다.


반면에 패딩 없이 순수한 입력 배열에서만 합성곱을 하여 특성맵을 만드는

경우를 Valid Padding이라고 한다. padding 매개변수의 default값 이기도 하다.


합성곱에서 Padding을 즐겨 사용하는 이유는 뭘까?

만약 Padding 없이 위 그림에서 합성곱을 한다면 모서리 값들은 단 한 번만 계산된다.

반면 다른 원소들은 2번 이상 계산된다. 만약 모서리에 중요한 정보가 담겨 있을 경우

학습에 좋지 않은 영향을 준다.

이처럼 적절한 패딩은 이미지의 주변에 있는 정보를 잃어버리지 않도록 도와준다.


스트라이드(Stride)

필터가 이동하는 칸의 개수이며, tuple로 이동 칸수를 지정할 수 있다.

보통 커널의 이동 크기를 가로세로 바향으로 다르게 지정하는 경우는 드물다.

또 1보다 큰 strides를 사용하는 경우도 드물다. 대부분 기본값 1을 사용한다.

from tensorflow import keras

keras.layers.Conv2D(
    10, 
    kernel_size=(3,3), 
    activation='relu',
    padding='same',
    strides=1
)


💡 풀링(Pooling)

합성곱 층에서 만든 특성 맵의 가로세로 크기를 줄이는 역할(특성맵의 개수는 유지)

Pooling은 특성 맵에 커널 없는 필터를 적용하는 것과 비슷하다.

즉, Pooling에는 가중치가 없다. 대신에 최댓값과 평균값을 계산하는 역할을 수행한다.

이를 각각 max pooling, average pooling 이라고 부른다.


앞에서 봤듯, 합성곱에서는 커널이 한 칸씩 이동했기 때문에 겹치는 부분이 있었다.

이와 반대로 Pooling은 중요한 특성을 하나 가지고 있는데,

바로 겹치지 않고 이동 한다는 점이다.

따라서 Pooling의 크기가 (2,2)라고 하면 가로세로 두 칸씩 이동한다. 즉, stride=2 이다.


keras에서는 MaxPooling2D, AveragePooling2D 클래스로 pooling을 수행할 수 있다.

AveragePooling2D의 경우에는 특성 맵에 있는 중요한 정보를 희석시킬 수 있기

때문에 보통 MaxPooling2D을 많이 사용한다.


첫 번째 매개변수는 pooling의 크기인데, 보통 2로 지정한다.

물론 tuple로 지정할 수 있지만 그럴일은 매우 드물다.

그 다음 매개변수로는 strides와 padding을 순서대로 지정해준다.

strides는 pooling의 크기로 자동으로 지정된다.

pooling은 패딩을 사용하지 않기 때문에 ‘valid’로 지정해준다.

keras.layers.MaxPooling2D(2, strides=2, padding='valid')


💡 CNN의 전체 구조

출력층 전에 있는 특성 맵을 모두 펼쳐서 밀칩층의 입력으로 사용한다.



💡 컬러 이미지를 사용한 합성곱

컬러 이미지는 RGB(빨강, 초록, 파랑) 채널로 구성되어 있기 때문에

(4,4,3)와 같은 식으로 3차원으로 표시해야 한다.

(너비, 높이, 깊이)

깊이가 있는 입력에서 합성곱을 수행하기 위해서는 필터도 깊이가 필요하다.

물론 커널 배열의 깊이는 항상 입력의 깊이와 같아야한다.

여기서 중요한 것은 입력이나 필터의 차원이 몇 개인지 상관없이 출력은 항상 하나의 값이다.