问题描述
feature map的卷积和池化后的shape计算公式为:(W - kernel_size +2*p)/strides +1,当除法部分不能整除时需要进行舍入,对向上取整还是向下取整进行探讨。
测试
输入图像为RGB三通道,input_shape=(300,300,3)
API | padding | strides | kernel_size | 执行前shape | 执行后shape | 理论计算shape |
---|---|---|---|---|---|---|
Conv2D | ‘valid’ | 1 | 3 | 300 | 298 | 297+1 |
Conv2D | ‘valid’ | 2 | 3 | 300 | 149 | 148.5+1,推出向下取整 |
Conv2D | ‘same’ | 1 | 3 | 300 | 300 | 300,推出p=1 |
Conv2D | ‘same’ | 2 | 3 | 300 | 150 | 149.5+p,推出向下取整且p=1 |
Maxpooling2D | ‘valid’ | 1 | 3 | 300 | 298 | 297+1 |
Maxpooling2D | ‘valid’ | 2 | 3 | 300 | 149 | 148.5+1,推出向下取整 |
Maxpooling2D | ‘same’ | 1 | 3 | 300 | 300 | 300,推出p=1 |
Maxpooling2D | ‘same’ | 2 | 3 | 300 | 150 | 149.5+p,推出向下取整且p=1 |
结论
无论是Conv2D还是Maxpooling2D:
1.取整都是向下取整
2.‘same’时,p都为1
如有错误欢迎指正。
测试代码
import tensorflow as tf
class TestModel(tf.keras.Model):
def __init__(self, shape):
super(TestModel, self).__init__()
self.w, self.h, self.c = shape
self.input_layer = tf.keras.layers.Input(shape=(self.w, self.h, self.c))
# self.conv1 = tf.keras.layers.Conv2D(3, kernel_size=3, strides=2, padding='same')
self.max_pool = tf.keras.layers.MaxPooling2D(3,strides=2,padding='same')
self.out_layer = self.call(self.input_layer)
def build(self, input_shape=None):
super(TestModel, self).build(input_shape=(None, self.w, self.h, self.c))
def call(self, inputs, training=None, mask=None):
# x = self.conv1(inputs)
x = self.max_pool(inputs)
return x
if __name__ == '__main__':
my_model = TestModel(shape=(300, 300, 3))
my_model.build()
my_model.summary()