Bootstrap

关于Tensorflow中padding细节

问题描述

feature map的卷积和池化后的shape计算公式为:(W - kernel_size +2*p)/strides +1,当除法部分不能整除时需要进行舍入,对向上取整还是向下取整进行探讨。

测试

输入图像为RGB三通道,input_shape=(300,300,3)

APIpaddingstrideskernel_size执行前shape执行后shape理论计算shape
Conv2D‘valid’13300298297+1
Conv2D‘valid’23300149148.5+1,推出向下取整
Conv2D‘same’13300300300,推出p=1
Conv2D‘same’23300150149.5+p,推出向下取整且p=1
Maxpooling2D‘valid’13300298297+1
Maxpooling2D‘valid’23300149148.5+1,推出向下取整
Maxpooling2D‘same’13300300300,推出p=1
Maxpooling2D‘same’23300150149.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()
;