使用 ZeroPadding+Convolution 而不是 Convolution with padding='same'

Use ZeroPadding+Convolution instead of Convolution with padding='same'

我使用 Tensorflow 2.0 已经将近一年了,在卷积中使用填充 'same' 时,我在不少代码中发现了一个概念。

我看到的一些代码实现了以下内容:

 x = ZeroPadding2D(padding=(pad, pad))(x)
 x = Conv2D(64, (3, 3), strides=(1, 1), dilation_rate=pad,
                  use_bias=False)(x)

而不是直接使用:

x = Conv2D(64, (3, 3), strides=(1, 1), dilation_rate=pad,
                  use_bias=False, padding='same')(x)

在卷积之前用padding='valid'做padding和在卷积里面直接用padding='same'有区别吗?

我猜这两种方法没有区别,那为什么会有人用这个呢?

差异绝对为零。

这是证明

import tensorflow as tf
from tensorflow.keras.layers import Conv2D, ZeroPadding2D

inputs = tf.ones((1, 5, 5, 1))
kernel_initializer = tf.keras.initializers.Constant(2)

pad = 1
x = ZeroPadding2D(padding=(pad, pad))(inputs)
x = Conv2D(
    64,
    (3, 3),
    strides=(1, 1),
    dilation_rate=pad,
    use_bias=False,
    kernel_initializer=kernel_initializer,
)(x)

y = Conv2D(
    64,
    (3, 3),
    strides=(1, 1),
    dilation_rate=pad,
    use_bias=False,
    padding="same",
    kernel_initializer=kernel_initializer,
)(inputs)

tf.assert_equal(x, y)

人们首先这样做,也许是因为他们想记住公式 (?) 或者因为这是他们的文体选择 - 但它在实践中的差异为零