📌 이 글은 권철민님의 딥러닝 CNN 완벽 가이드를 바탕으로 정리한 내용입니다.


목차

  1. 출력 Feature Map 크기 계산 공식
  2. Stride가 1이고 Padding이 없는 경우
  3. Stride가 1이고 Padding이 1인 경우
  4. Stride가 2이고 Padding이 없는 경우
  5. Stride가 2이고 Padding이 1인 경우
  6. 입력이 6X6에서 Stride가 2 적용
  7. output Feature map의 크기 공식의 일반적인 적용

출력 Feature Map 크기 계산 공식

I : 입력 Feature Map의 크기

F : Filter의 크기(Kernel size) : 4x4

P : Padding(정수) : 모서리 채우는 것, 1이면 4x4 → 5x5

S : Strides(정수) : 몇단위로 이동하나

 

크기는 모두 가로, 세로가 모두 동일한 걸로 간주한다.


Stride가 1이고 Padding이 없는 경우

  • I는 입력 Feature Map의 크기, F는 Filter의 크기(Kernel size), P는 Padding(정수), S는 Strides(정수)
  • O = (I - F + 2P)/2 + 1 = (5 - 3 + 0)/1 + 1 = 3

 

from tensorflow.keras.layers import Input, Conv2D, MaxPooling2D
from tensorflow.keras.models import Model

input_tensor = Input(shape=(5, 5, 1))
x = Conv2D(filters=1, kernel_size=3, strides=1)(input_tensor)
print('x.shape:', x.shape)

 


Stride가 1이고 Padding이 1인 경우

  • O = (I - F + 2P)/2 + 1 = (5 - 3 + 2 )/1 + 1 = 5
input_tensor = Input(shape=(5, 5, 1))
x = Conv2D(filters=1, kernel_size=3, strides=1, padding='same')(input_tensor)
print('x.shape:', x.shape)

 

# ZeroPadding2D Layer를 이용하여 padding을 수동으로 적용. 
from tensorflow.keras.layers import ZeroPadding2D

input_tensor = Input(shape=(5, 5, 1))
padded_input = ZeroPadding2D(padding=1)(input_tensor)
print('shape after padding:', padded_input.shape)
x = Conv2D(filters=1, kernel_size=3, strides=1)(padded_input)
print('x.shape:', x.shape)

 

Zero Padding을 하면 원본사이즈가 나오는 것을 확인할 수 있다.


Stride가 2이고 Padding이 없는 경우

  • O = (I - F + 2P)/2 + 1 = (5 - 3)/2 + 1 = 2

input_tensor = Input(shape=(5, 5, 1))
x = Conv2D(filters=1, kernel_size=3, strides=2)(input_tensor)
print('x.shape:', x.shape)


Stride가 2이고 Padding은 1 적용

  • O = (I - F + 2P)/2 + 1 = (5 - 3 + 2)/2 + 1 = 3

input_tensor = Input(shape=(5, 5, 1))
padded_input = ZeroPadding2D(padding=1)(input_tensor)
print('shape after padding:', padded_input.shape)
x = Conv2D(filters=1, kernel_size=3, strides=2)(padded_input)
print('x.shape:', x.shape)

 


입력이 6x6에서 Stride가 2 적용

  • O = (I - F + 2P)/2 + 1 = (6 - 3 + 0)/2 + 1 = 2.5 = 2

 

입력 Feature Map의 가장 오른쪽과 가장 아래에 있는 데이터는 Conv 적용이 안되 고 2 x 2 Output 생성

 

input_tensor = Input(shape=(6, 6, 1))
x = Conv2D(filters=1, kernel_size=3, strides=2)(input_tensor)
print('x.shape:', x.shape)

 

input_tensor = Input(shape=(6, 6, 1))
x = Conv2D(filters=1, kernel_size=3, strides=2, padding='same')(input_tensor)
print('x.shape:', x.shape)

 

padding=same 한다는 것은, strides가 2일 경우 맨 뒤의 한칸도 가주게 해주겠다는 뜻이다.

그래서 케라스가 알아서 padding을 넣어주고 계산해준다.

 

 

input_tensor = Input(shape=(6, 6, 1))
padded_input = ZeroPadding2D(padding=((1, 0),(1,0)))(input_tensor)
x = Conv2D(filters=1, kernel_size=3, strides=2)(padded_input)
print('x.shape:', x.shape)

 

ZeroPadding2D(padding=((1,0),(1,0)))(input_tensor)

의 뜻은 왼쪽과 위쪽의 모서리 두개만 padding을 해주는 기능이다.


output Feature map의 크기 공식의 일반적인 적용

복사했습니다!