在 Tensorflow 2 中定义自己的 pad

Defining own pad in Tensorflow 2

我正在使用一个简单的卷积网络,但是,我需要使用非常具体的填充:我想复制最近的像素值,如下所示:

1  2  3
4  5  6
7  8  9

1  1  2  3  3
1  1  2  3  3
4  4  5  6  6
7  7  8  9  9
7  7  8  9  9

虽然我计算 pad 本身没有问题,但我不能在卷积中使用它。有没有办法将这些值放入 tensorflow pad 中?或者我可以修改图像,使其包含填充,但如何设置卷积以将第一行和最后一行和列作为填充处理?

您可以在调用 conv2d 之前使用对称模式简单地调用 tf.pad,同时指定卷积应使用 VALID 填充模式:

>>> a = tf.reshape(tf.range(9),(3,3))
>>> a
<tf.Tensor: shape=(3, 3), dtype=float32, numpy=
array([[0., 1., 2.],
       [3., 4., 5.],
       [6., 7., 8.]], dtype=float32)>
>>> padded_a = tf.pad(a,[[1,1],[1,1]],"SYMMETRIC")
>>> padded_a
<tf.Tensor: shape=(5, 5), dtype=float32, numpy=
array([[0., 0., 1., 2., 2.],
       [0., 0., 1., 2., 2.],
       [3., 3., 4., 5., 5.],
       [6., 6., 7., 8., 8.],
       [6., 6., 7., 8., 8.]], dtype=float32)>

现在,如果我们创建一个由 1 组成的简单 3x3 滤波器,作为卷积的结果,我们应该得到相邻元素的总和(包括 pad),其形状与我们的原始输入相同:

>>> filters = tf.ones((3,3,1,1))
>>> conv_result = tf.nn.conv2d(padded_a[tf.newaxis,:,:,tf.newaxis], filters, padding="VALID", strides=1)
>>> tf.squeeze(conv_result) # just removing the batch and channel dimensions
 <tf.Tensor: shape=(3, 3), dtype=float32, numpy=
array([[12., 18., 24.],
       [30., 36., 42.],
       [48., 54., 60.]], dtype=float32)>