본문 바로가기
취미

[딥러닝] 합성곱 신경망(convolution) 딥러닝 기초

by climb_JJIYO 2024. 2. 14.
반응형

이미지 처리 및 컴퓨터 비전 분야에서 신경망은 이미지의 특징을 감지하고 추출하기 위해 합성곱 연산을 활용합니다. 이러한 합성곱 필터는 이미지의 일부분과 픽셀끼리 곱한 후 결과를 더하는 과정으로 이루어지며, 이미지의 영역이 필터와 유사할수록 큰 양수가 출력되고 반대로 유사하지 않을수록 큰 음수가 출력됩니다. 이를 통해 필터의 값에 따라 입력 이미지의 특성을 반영한 새로운 배열을 얻을 수 있습니다.

 1. 합성곱 신경망

합성곱 층

MLP가높은 성능을 내지 못하는 이유는 입력 이미지의 공간 구조를 다루는 요소가 없기 때문입니다.

이를 해결하기 위해 합성곱 layer를 사용합니다.

합성곱은 필터를 이미지의 일부분과 픽셀끼리 곱한 후 결과를 더하는 것입니다.

이미지의 영역이 필터와 비슷할수록 큰 양수가 출력되고 필터와 반대일수록 큰 음수가 출력됩니다.

필터를 전체 이미지에 대해서 왼쪽에서 오른쪽으로 위에서 아래로 이동하면서 합성곱의 출력을 기록합니다.

이를 통해 필터의 값에 따라 입력의 특성을 반영한 새로운 배열을 얻을 수 있습니다.

 

합성곱 층은 보통 필터를 하나가 아니라 여러개를 사용하고 단순한 필터의 모음입니다. 필터에 저장된 값은 훈련하는 동안 신경망이 학습하는 가중치입니다. 필터는 랜덤하게 초기화되지만 필터가 모서리나 특정 색깔 등의 특성을 감지하도록 가중치를 조정해나갑니다.

 

케라스에서는 Conv2D 층을 사용해 높이와 너비를 가진 입력 텐서에 합성곱을 적용합니다.

아래 예제 코드는 두 개의 필터가 있는 합성곱 층을 만듭니다.

from tensorflow.keras import layers

input_layer = layers.Input(shape=(64,64,1))
conv_layer_1 = layers.Conv2D(filters =2,
                             kernel_size = (3,3),
                             strides = 1,
                             padding = 'same'
                            )(input_layer)

 

 

스트라이드(strides)

strides 매개변수는 필터가 한번에 입력 위를 이동하는 크기입니다. 스트라이드를 크게 하면 출력 텐서의 크기가 줄어듭니다. 예를 들어 strides = 2로 하면 출력 텐서의 높이와 너비는 입력 텐서의 절반이 됩니다. 신경망을 통과하면서 채널의 수는 늘리고 텐서의 공간 방향 크기를 줄이는데 사용합니다.

 

패딩(padding)

padding = "same" 매개변수는입력 데이터를 0으로 패딩하여 strides = 1 일 때, 출력의 크기를 입력크기와 동일하게 만듭니다. padding = "same"으로 지정하면 여러 개의 합성곱 층을 통과할 때 텐서의 크기를 쉽게 파악할 수 있기 때문에 유용합니다.  

2. 합성곱 신경망 만들기

Conv2D 층의 ( batch_size, height, width, filters) 크기의 4차원 텐서이므로 이 위에 Conv2D 층을 쌓아 신경망의 깊이를 더 키우고 강력하게 만들 수 있습니다. 

아래는 Conv2D 층을 적용하고 어떤 이미지의 레이블을 예측을 위해 훈련할 간단한 합성곱 신경망 예제 코드입니다.

 

컬러 이미지를 다룬다고 가정했으므로 합성곱 층의 필터 깊이는 1이 아닌 3입니다. 동일한 방식이 두번째 층의 필터에도 적용되며, 필터의 깊이는 10입니다.

from tensorflow.keras import layer, models

input_layer = layers.Input(shape=(32,32,3))
conv_layer_1 = layers.Conv2D(
    filters = 10,
    kernel_size = (4,4),
    strides = 2,
    padding = 'same'
)(input_layer)
conv_layer_2 = layers.Conv2D(
    filters = 20,
    kernel_size = (3,3),
    strides = 2,
    padding = 'same'
)(conv_layer_1)
flatten_layer = layers.Flatten()(conv_layer_2)
output_layer = layers.Dense(units=10, activation = 'softmax')(flatten_layer)
model = models.Model(input_layer, output_layer)

 

 model.summary

layer size parameter
InputLayer (None, 32, 32, 3) 0
Conv2D (None, 16, 16, 10) 490
Conv2D (None, 8, 8, 20) 1,820
Flatten (None, 1280) 0
Dense (None, 10) 12,810
총 파라미터 개수 15,120
훈련되는 파라미터 개수 15,120
훈련되지 않는 파라미터 개수 0

 

 

  1. 입력의 크기는 (None, 32, 32, 3) 입니다. 케라스는 None을 사용하여 한꺼번에임의 개수의 이미지를 신경망에 통과시킬 수 있음을 표현합니다. 
  2. 첫번째 합성곱 층의 10개 필터는각 크기의 4*4*3 입니다. 필터의 높이와 너비는 이전 층이 3이기 때문에 4로 선택(kenel_size = (4,4)) 했습니다. 이 층의 파라미터(가중치) 수는 (4*4*3*+1) * 10 - 490개 입니다.
    필터마다 편향 항이 포함되기 때문에 +1 을 합니다. strides = 2 이고 padding = "same" 이므로 출력의 높이와 너비는 16이 됩니다. 10개의 필터를 사용했으므로 배치 차원을 제외한 첫번째 층의 출력 크기는 [16,16,10] 이 됩니다.
  3. 두번째 합성곱 층의 필터의 크기는 3*3 으로 선택했고 이전 층의 채널 수와 동일하게 깊이는 10이 됩니다. 이 층의 필터는 20개를 사용하기 때문에 전체 파라미터(가중치)의 수는 (3*3*10+1) * 20 = 1,820개 입니다. 여기서도 첫번째와 동일한 strides와 padding을 설정했으므로 높이와 너비가 반으로 줄어 최종 출력 크기는 (None, 8, 8, 20) 이 됩니다.
  4. Flatten 층을 사용해 텐서를 일렬로 펼칩니다. 8*8*20 = 1,280 유닛이 만들어집니다. Flatten은 단순히 텐서를 재구성하는 연산이므로 파라미터가 없습니다.
  5. 마지막으로 10개의 유닛과 소프트맥스 활성화 함수가 있는 Dense 층에 연결합니다. 학습할 파라미터의 개수는 1,280*10 = 12,810 입니다.

 

성능을 향상시키기 위한 방법

 

배치 정규화(BatchNormalization)

심층 신경망을 훈련할 때 가중치를 일정한 범위 안에서 유지해야하는 것이 중요합니다. 값이 커지기 시작하면 오차가 신경망을 통해 거꾸로 전파되면서 앞에 놓은 층의 가중치 계산이 기하급수적으로 증가할 수 있습니다. 즉, 가중치 값을 큰 폭으로 출렁이게 합니다. 배치 정규화를 사용하여 이 문제를 줄일 수 있습니다.

훈련하는 동안 배치 정규화 층은 배치에 대해 각 입력 채널별로 평균과 표준편차를 계산한 다음 평균을 빼고 표준 편차로 나누어 정규화합니다. 배치 정규화 층을 완전 연결층이나 합성곱 층 직후에 두어 출력을 정규화합니다.

 

아래 코드는 배치 정규화 층의 예제입니다.

from tensorflow.keras import layers
layers.BatchNormalization(momentum=0.9)

 

momentum 매개변수는 평균과 표준편차의 이동 평균을 계산할 때 이전 값에 주는 가중치입니다.

 

 

드롭아웃(Dropout)

잘 학습된 모델은 훈련 데이터 뿐만 아니라 새로운 데이터에도 일반화되어야합니다. 모델이 훈련 데이터셋에서만 잘 작동하고 테스트 세트에서는 그렇지 않다면 이는 과대적합 문제가 있다고 말합니다.

과대적합에 대응하려면 규제 기법을 사용하여 모델이 과대적합 되면 벌칙을 부여합니다. 규제 기법 중 딥러닝에서는 드롭아웃 층을 사용합니다.

드롭아웃은 훈련과정에서 이전 층의 유닛 일부를 랜덤하게 선택하여 출력을 0으로 지정합니다. 특정 유닛 하나 혹은 일부에 과도하게 의존하지 않기 때문에 과대적합이 줄어들 수 있습니다.

드롭아웃 층은 가중치 개수가 맣아 과대적합되기 가장 쉬운 Dense 층 다음에 주로 사용됩니다.

from tensorflow.keras import layers
layers.Dropout(rate=0.25)

  

rate 매개변수는 이전 층에서 드롭아웃할 유닛의 비율을 지정합니다.

 

결론적으로, 케라스와 같은 딥러닝 프레임워크를 사용하면 간편하게 합성곱 층을 구성할 수 있으며, 이는 이미지 분류, 객체 감지, 얼굴 인식 등 다양한 응용 분야에서 활용됩니다. 따라서, 합성곱 층은 이미지 처리에 있어서 필수적이고 효과적인 도구로써 중요한 역할을 하며, 이를 통해 다양한 실제 문제에 대한 해결책을 제공할 수 있습니다.

반응형