CNN의 주요 계층 - Convolutional Layer (합성곱 층) 정리

2025. 2. 1. 21:32AI/딥러닝

1. 합성곱 층(Convolutional Layer) 개요

합성곱 층(Convolutional Layer)은 CNN의 핵심 요소로, 이미지에서 중요한 특징을 추출하는 역할을 합니다. 필터(Filter, Kernel)를 사용하여 윤곽선, 모서리, 질감 등의 패턴을 감지하며, 일반적인 완전 연결 신경망(Dense Layer)보다 적은 가중치를 사용하여 연산량을 줄이고 성능을 향상시킵니다.


2. 패딩(Padding)과 스트라이드(Stride)

패딩(Padding)

패딩은 입력 이미지의 가장자리에 0을 추가하여 출력 크기를 조정하는 기법입니다.

  • 'valid' 패딩: 패딩 없이 필터가 적용되므로 출력 크기가 줄어듦.
  • 'same' 패딩: 출력 크기가 입력과 동일하도록 적절한 0을 추가하여 필터 적용.
conv_layer_valid = Conv2D(filters=32, kernel_size=(3,3), padding='valid')  # 출력 크기 감소
conv_layer_same = Conv2D(filters=32, kernel_size=(3,3), padding='same')  # 출력 크기 유지

스트라이드(Stride)

스트라이드는 필터가 한 번에 이동하는 픽셀 수를 의미합니다.

  • 기본적으로 stride=1이 많이 사용되며, 이 경우 필터가 1픽셀씩 이동하면서 특징을 추출합니다.
  • stride 값이 커질수록 출력 크기가 작아지고, 연산량이 감소합니다.
conv_layer_stride = Conv2D(filters=32, kernel_size=(3,3), strides=(2,2), padding='same')

3. 활성화 함수(Activation Function)

ReLU(Rectified Linear Unit)

  • 가장 일반적으로 사용되는 활성화 함수
  • 입력이 0보다 크면 그대로 출력, 0보다 작으면 0을 출력
  • 기울기 소실(Vanishing Gradient) 문제를 완화하여 깊은 신경망 학습 가능

Leaky ReLU (Leaky Rectified Linear Unit)

  • ReLU의 변형으로, 입력이 0보다 작을 때 작은 기울기를 유지 (예: 0.01*x)
  • 완전히 0으로 사라지는 문제가 발생하지 않음

ELU (Exponential Linear Unit)

  • 입력이 0보다 작을 때 지수 함수를 사용하여 음수 값을 부드럽게 유지
  • Leaky ReLU보다 학습 속도를 빠르게 할 수 있음
from tensorflow.keras.layers import ReLU, LeakyReLU, ELU

relu_layer = ReLU()
leaky_relu_layer = LeakyReLU(alpha=0.01)
elu_layer = ELU(alpha=1.0)

4. 필터 작동 방식 시각화 및 실행 결과

합성곱 연산이 이미지에서 특정 패턴을 감지하는 과정을 시각화하는 코드입니다.

import numpy as np
import matplotlib.pyplot as plt
from scipy.signal import convolve2d

# 샘플 이미지 생성 (8x8 그리드)
image = np.array([
    [0, 0, 1, 1, 1, 0, 0, 0],
    [0, 1, 1, 1, 1, 1, 0, 0],
    [1, 1, 1, 1, 1, 1, 1, 0],
    [1, 1, 1, 1, 1, 1, 1, 0],
    [0, 1, 1, 1, 1, 1, 0, 0],
    [0, 0, 1, 1, 1, 0, 0, 0],
    [0, 0, 0, 0, 0, 0, 0, 0],
    [0, 0, 0, 0, 0, 0, 0, 0]
])

# 필터 (Edge Detection)
filter_ = np.array([
    [-1, -1, -1],
    [ 0,  0,  0],
    [ 1,  1,  1]
])

# 합성곱 연산 적용
filtered_image = convolve2d(image, filter_, mode='valid')

# 원본 및 결과 이미지 시각화
fig, axes = plt.subplots(1, 2, figsize=(10, 5))
axes[0].imshow(image, cmap='gray')
axes[0].set_title('Original Image')
axes[1].imshow(filtered_image, cmap='gray')
axes[1].set_title('Filtered Image')
plt.show()

실행 결과:

  • 왼쪽: 원본 이미지
  • 오른쪽: 필터 적용 후 특징이 강조된 이미지

5. 참고 문헌