📌 이 글은 권철민님의 딥러닝 CNN 완벽 가이드를 바탕으로 정리한 내용입니다.
목차
- 출력 Feature Map 크기 계산 공식
- Stride가 1이고 Padding이 없는 경우
- Stride가 1이고 Padding이 1인 경우
- Stride가 2이고 Padding이 없는 경우
- Stride가 2이고 Padding이 1인 경우
- 입력이 6X6에서 Stride가 2 적용
- 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의 크기 공식의 일반적인 적용
'🖼 Computer Vision > CNN' 카테고리의 다른 글
CNN - Weight Initialization (0) | 2022.03.03 |
---|---|
CIFAR10 (0) | 2022.03.03 |
CNN - Convolution 연산에서 Filter에 대한 이해 (2) | 2022.03.02 |
CNN - Fashion MNIST 예측 모델 구현하기 (0) | 2022.03.02 |
CNN - Conv2D 와 Pooling 적용 실습 (0) | 2022.02.18 |