logo

패딩과 스트라이드

합성곱 출력 크기

  • 출력 채널 수는 Conv2Dfilters와 같음
  • 출력 높이와 너비는 커널 크기, 패딩, 스트라이드에 따라 결정
  • 피처 맵의 공간 크기가 항상 감소하는 것은 아님

팽창 합성곱을 사용하지 않을 때 한 축의 출력 크기는 다음과 같음.

  • : 입력 크기
  • : 커널 크기
  • : 한쪽에 추가한 패딩 크기
  • : 스트라이드
  • : 출력 크기

합성곱과 풀링에 따라 공간 크기와 채널 수가 달라지는 과정

패딩 padding

  • 유효 패딩(valid padding): 패딩을 추가하지 않으므로 커널 크기에 따라 출력이 작아짐
  • 세임 패딩(same padding): Keras가 0을 자동으로 추가하며, 스트라이드가 1이면 입력과 출력의 공간 크기가 같음
  • 풀 패딩(full padding): 한쪽에 만큼 패딩해 모든 겹침을 계산하는 신호 처리 방식
  • Keras Conv2Dpadding 인자는 "valid""same"을 직접 지원
  • 풀 패딩이 필요하면 ZeroPadding2D 등으로 패딩을 명시적으로 추가

패딩을 추가하지 않아 출력 공간 크기가 작아지는 유효 패딩

입력 가장자리에 0을 추가해 출력 공간 크기를 유지하는 세임 패딩

입력 주변을 넓게 패딩해 모든 겹침을 계산하는 풀 패딩

제로 패딩과 패딩 크기 0

  • 제로 패딩은 추가한 픽셀의 값을 0으로 채우는 방식
  • 패딩 크기 은 패딩을 추가하지 않는 유효 패딩

스트라이드 stride

  • 스트라이드는 필터가 한 번 계산한 뒤 이동하는 간격
  • 스트라이드가 커지면 필터를 적용하는 위치가 줄어 출력 공간 크기도 작아짐
  • 풀링 대신 스트라이드가 큰 합성곱으로 다운샘플링하기도 함

필터가 입력 격자의 왼쪽 위 지역에 적용된 첫 번째 위치

필터가 입력 격자의 오른쪽 위 지역으로 이동한 위치

필터가 입력 격자의 왼쪽 아래 지역으로 이동한 위치

필터가 입력 격자의 오른쪽 아래 지역으로 이동한 위치

Keras 실습

같은 3×3 필터 32개를 사용하고 패딩과 스트라이드만 변경해 공간 크기를 비교.

import os
os.environ["KERAS_BACKEND"] = "torch"

import keras

keras.utils.set_random_seed(812)  # 레이어 가중치 초기값 재현
sample = keras.ops.zeros((1, 28, 28, 1))  # 흑백 이미지 1장의 배치
tuple(
    keras.layers.Conv2D(
        32, (3, 3), padding="valid"  # 3×3 필터 32개
    )(sample).shape
)  # valid 출력 형태
실행 결과
(1, 26, 26, 32)
tuple(
    keras.layers.Conv2D(
        32, (3, 3), padding="same"  # 공간 크기 유지
    )(sample).shape
)  # same 출력 형태
실행 결과
(1, 28, 28, 32)
tuple(
    keras.layers.Conv2D(
        32, (3, 3), strides=(2, 2)  # 두 칸씩 이동
    )(sample).shape
)  # 스트라이드 2 출력 형태
실행 결과
(1, 13, 13, 32)
  • valid: 패딩이 없어 28×28에서 26×26으로 감소
  • same: 스트라이드가 1이므로 28×28 유지
  • stride_2: 두 칸씩 이동해 13×13으로 감소
  • 세 결과의 마지막 차원은 필터 수와 같은 32
Previous
합성곱 신경망(CNN)