使用 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)
人们首先这样做,也许是因为他们想记住公式 (?) 或者因为这是他们的文体选择 - 但它在实践中的差异为零
我使用 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)
人们首先这样做,也许是因为他们想记住公式 (?) 或者因为这是他们的文体选择 - 但它在实践中的差异为零