본문 바로가기

머신러닝 + 딥러닝

[혼공딥] CHAPTER 08-1 합성곱 신경망의 구성 요소

728x90

합성곱(convolution)

- (수학) 하나의 함수와 또 다른 함수를 반전 이동한 값을 곱한 다음, 구간에 대해 적분하여 새로운 함수를 구하는 것

 

 

인공 신경망 합성곱
- 가중치 w1~w10과 절편 b를 랜덤하게 초기화한 다음 에포크를 반복하면서 경사 하강법 알고리즘을 사용하여 손실이 낮아지도록 최적의 가중치와 절편을 찾아간다.

- 입력 개수에 상관없이 밀집층의 뉴런의 개수와 출력의 개수가 같다.
- 입력 데이터 전체에 가중치를 적용하는 것이 아니라 일부에 가중치를 곱한다.

- 뉴런이 3개의 가중치를 가진다고 가정하면, 가중치 w1~w3이 입력의 처음 3개 특성과 곱해져서 1개의 출력을 만든다.

- 같은 가중치와 절편이 여러 개의 합성곱에 사용된다.

 

밀집층의 뉴런은 입력 개수만큼 10개의 가중치를 가지고 1개의 출력을 만든다. 합성곱 층의 뉴런은 3개의 가중치를 가지고 8개의 출력을 만든다.

 

합성곱 층의 가중치 개수는 하이퍼파라미터로 정하기 나름이다.

 

 

합성곱 신경망(convolutional neural network, CNN)

: 행렬로 표현된 필터의 각 요소가 데이터 처리에 적합하도록 자동으로 학습되게 하는 것

 

- 뉴런=필터(filter)=커널(kernel)

- 커널 : 입력에 곱하는 가중치

- 필터 : 뉴런의 개수를 표현할 때 사용

 

입력이 2차원 배열이면 필터도 2차원이어야한다. (커널의 크기를 3x3으로 가정)

입력의 9개 원소와 커널의 9개 가중치를 곱하고 절편을 더해 1개의 출력을 만든다.

그 다음 오른쪽으로 한 칸, 맨 왼쪽에서 아래로 한 칸씩 이동하여 합성곱을 수행한다.

 

합성곱은 왼쪽 위에서 오른쪽 맨 아래까지 이동하면서 출력을 만든다. 입력의 가중치의 행과 열을 맞추어 곱셈하고 모두 더한다. 필터는 모두 4번 이동해서 4개의 출력을 만든다.

 

특성 맵(feature map) : 합성곱 계산을 통해 얻은 출력

(2, 2) 크기의 특성 맵을 쌓으면 3차원배열이 된다. 3개의 필터를 사용했기 때문에 (2, 2, 3) 크기의 3차원 배열이 된다.

합성곱 층에 있는 필터의 가중치(커널)도 모두 다르다

 

정리)

1. 밀집층과 동일하게 단순히 입력과 가중치를 곱하는 것이지만 2차원 형태를 유지하는 점이 다르다.

2. 입력보다 훨씬 작은 크기의 커널을 사용하고 입력 위를 (왼쪽->오른쪽, 위->아래) 이동하면서 2차원 특성 맵을 만든다.

-> 2차원 구조를 그대로 사용하기 때문에 합성곱 신경망이 이미지 처리 분야에서 뛰어난 성능을 발휘한다.

 

 

  • 케라스 합성곱 층

입력 위를 (왼쪽에서 오른쪽으로, 위에서 아래로) 이동하는 합성곱은 Conv2D 클래스로 제공된다

keras.layers.Conv2D(filters, kernel_size, strides=(1, 1), padding='valid', data_format=None, dilation_rate=(1, 1), activation=None, use_bias=True, kernel_initializer='glorot_uniform', bias_initializer='zeros', kernel_regularizer=None, bias_regularizer=None, activity_regularizer=None, kernel_constraint=None, bias_constraint=None)

- filters : 필터의 개수

- kernel_size : 커널 크기(대부분 정방향, 3x3, 5x5)

- padding : 'valid' 혹은 'same'

- activation : 활성화 함수, none이면 아무것도 적용X

 

케라스 API를 사용하면 합성곱 층을 사용하는 것이 어렵지 않다. Dense 층을 사용했던 자리에 Conv2D 층을 넣으면 된다.

합성곱 신경망은 1개 이상의 합성곱 층을 쓴 인공 신경망을 합성곱 신경망이라고 부른다

 

 

  • 패딩과 스트라이드

Q. (4,4)크기의 입력에 커널 크기는 (3,3)으로 두고 출력의 크기를 (4,4)로 만드는 방법

A. 실제 입력 크기는 (4,4)이지만, (6,6)크기가 있다고 생각을 하고 (3,3)크기의 커널로 합성곱을 한다!

그러면 슬라이딩을 4번씩 할 수 있어서 4x4=16개의 픽셀이 만들어진다.

 

패딩(padding) : 입력 배열의 주위를 가상의 원소로 채우는 것

- 실제 입력값이 아니기 때문에 0으로 된 가상의 배열을 덧붙이는 것

- 필터가 슬라이딩 하는 위치를 늘리기 위해

 

세임 패딩(same padding) : 입력과 특성 맵의 크기를 동일하게 만들기 위해 입력 주위에 0으로 패딩하는 것

- 입력과 특성 맵의 크기를 동일하게 만드는 경우가 많다

 

밸리드 패딩(valid padding) : 패딩 없이 순수한 입력 배열에서만 합성곱을 하여 특성 맵을 만드는 경우

- 특성 맵의 크기가 줄어든다

 

 

Q. 패딩을 사용하는 이유?

A. 픽셀마다 합성곱 연산에 기여하는 바가 달라 주변 픽셀들의 중요한 정보가 있다면 잘 감지하기 어렵다.

 

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

padding 매개변수로 패딩을 지정할 수 있다.

- same : 세임 패딩, 입력과 출력의 특성맵 크기가 같아지도록 자동으로 패딩의 크기를 추가

- valid : 패딩을 전혀 사용하지 않아 특성맵 크기가 작다

 

 

스트라이드(stride) : 필터를 적용하는 위치의 간격

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

기본으로 스트라이드는 1이고 튜플로 이동 칸 수를 지정할 수 있다. 대부분 기본값을 사용해서 strides 매개변수는 잘 사용하지 않는다.

 

 

풀링(pooling) : 합성곱 층에서 만든 특성 맵의 가로세로 크기를 줄이는 역할을 수행

- 합성층 곱에서 입력과 출력의 크기를 동일하게 만드는 same 패딩을 사용해 동일한 크기의 특성맵을 만들고 그 특성맵을 풀링을 사용해서 절반으로 줄인다

- 마지막 차원인 개수는 그대로 유지하고 너비와 높이만 줄인다

 

풀링은 가중치가 없이 최댓값이나 평균값을 계산하는 역할을 수행한다.

파라미터를 줄이기 때문에 과대적합을 방지, 계산이 줄어들어 하드웨어 리소스를 절약하고 속도가 증가한다

 

  • 최대 풀링

가장 큰 값을 고르기 때문에 처음 (2,2)영역에서 9를 고른다. 이런 식으로 최댓값만 골라 (2,2) 크기의 출력을 만든다.

- 풀링의 크기가 (2,2)이면 가로세로 두 칸씩 이동한다. -> 스트라이드가 2이다

 

풀링은 가중치가 없고 풀링 크기와 스트라이드가 같고 패딩도 없다

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

- 첫번째 매개변수로 풀링의 크기 지정

- strides : 기본값이 자동으로 풀링의 크기가 되어 따로 지정할 필요X

- padding : 기본값은 'valid'로 패딩을 하지 않는다

 

 

  • 평균 풀링

- 대상 영역의 평균을 계산, 해당 구역 내에서 데이터를 모두 더한 다음 나누어 평균이 출력된다

- 특성 맵에 있는 중요한 정보를 평균해서 희석시킬 수 있기 때문에 많이 사용하지 않는다

 

keras.layers.AveragePooling2D(pool_size=(2, 2), strides=None, padding='valid')

pool_size : 튜플, (가로, 세로)의 기준이 되는 요소

strides : None이면 기본값이 풀링의 크기

padding : 'valid'이면 패딩이 없음을 의미, 'same'이면 출력이 입력과 동일한 높이/너비를 갖도록 입력의 왼쪽/오른쪽이나 위/아래로 균등하게 패딩된다.

 

 

  1. 합성곱의 필터는 3개, 각각 (3,3) 크기 가중치를 가지고 있고 필터마다 절편이 하나씩 있다.
  2. 합성곱의 스트라이드는 항상 1이다. 만들어지는 특성 맵의 크기가 (4,4)이다. 3개의 필터가 하나씩 합성곱의 출력을 만들고 이들이 합쳐져서 (4,4,3) 크기의 특성 맵이 만들어진다. 활성화 함수로 주로 렐루 함수를 사용
  3. 풀링층은 합성곱 층에서 만든 특성 맵의 가로세로 크기를 줄인다. 보통 (2,2) 풀링을 사용하고, (4,4,3)에서 (2,2,3)으로 특성 맵 개수는 유지된 채로 줄여졌다.
  4. 밀집층에서 3차원 배열을 1차원으로 펼쳐 전달해야한다. 2x2x3으로 12개의 원소를 가진 1차원 배열이고 출력층의 입력이 된다
  5. 출력층에는 3개의 뉴런을 두어 소프트맥스 활성화함수를 거쳐서 최종 예측 확률로 만들 수 있다

 

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

컬러 이미지는 RGB 채널로 구성되어 있어 3차원 배열로 표시한다

너비와 높이, 깊이 차원이 있다

- 커널 배열의 깊이는 항상 입력의 깊이와 같다

- (4,4,3) 크기의 입력이 있고 마지막 3이 깊이 차원이다. 필터의 커널 크기가 (3,3,3)이 된다

- 연산되는 부피는 (3x3x3)이 되고 가중치도 (3x3x3)이 곱해지고 절편 b가 추가된다

- 입력이나 필터의 차원이 몇 개인지 상관없이 항상 출력은 하나의 값이다.

 

흑백 이미지일 경우 깊이 차원이 1인 3차원 배열로 변환한다.

 

합성곱 층-풀링 층-합성곱 층일 때 

첫 번째 풀링 층을 통과한 특성 맵의 크기가 (4,4,5)라고 할 때 두 번째 합성곱 층에서 필터의 너비와 높이가 각각 3이라면 이 필터의 커널 크기는 (3,3,5)가 된다. -> 입력의 깊이=필터의 깊이

 

두 번째 합성곱 층의 필터 개수가 10개라면 만들어진 특성 맵의 크기는 (2,2,10)이 될 것이다. 합성곱 신경망은 너비와 높이는 점점 줄어들고 깊이가 깊어진다.

마지막에 출력층 전에 특성 맵을 모두 펼쳐서 밀집층의 입력으로 사용한다.

 

합성곱 신경망에서 필터는 이미지에 있는 어떤 특징을 찾는 것

- 처음에는 간단한 기본적인 특징(곡선, 직선 등)을 찾고 층이 깊어질수록 다양하고 구체적인 특징을 감지할 수 있도록 필터의 개수를 늘린다.

- 어떤 특징이 이미지의 어느 위치에 놓이더라도 쉽게 감지할 수 있도록 너비와 차원을 점점 줄여가는 것이다

 

728x90