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