logo

패딩과 스트라이드

합성곱 출력 크기

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

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

O=SI+2PK+1
  • I: 입력 크기
  • K: 커널 크기
  • P: 한쪽에 추가한 패딩 크기
  • S: 스트라이드
  • O: 출력 크기

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

패딩 padding

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

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

입력 가장자리에 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

퀴즈

문제 1 / 4맞음: 0힌트: 0틀림: 0채점중: 0남음: 4

패딩과 스트라이드가 합성곱 출력에서 주로 결정하는 것은 무엇입니까?

  • 피처 맵의 높이와 너비
  • 피처 맵의 채널 수
  • 커널의 학습된 가중치
  • 활성화 함수의 종류

퀴즈를 풀려면 대화형 기능을 불러와야 합니다.

Previous
합성곱 신경망(CNN)