패딩과 스트라이드
합성곱 출력 크기
- 출력 채널 수는
Conv2D의filters와 같음 - 출력 높이와 너비는 커널 크기, 패딩, 스트라이드에 따라 결정
- 피처 맵의 공간 크기가 항상 감소하는 것은 아님
팽창 합성곱을 사용하지 않을 때 한 축의 출력 크기는 다음과 같음.
- : 입력 크기
- : 커널 크기
- : 한쪽에 추가한 패딩 크기
- : 스트라이드
- : 출력 크기

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



제로 패딩과 패딩 크기 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