tf.nn.conv2d_transpose的填充有什么作用?

时间:2018-01-28 13:26:19

标签: tensorflow convolution deconvolution

如我们所知,我们可以通过tensor的填充模式计算输出conv2d的形状,algorithm很明显,但我对{{1}非常困惑,它是否填充输入张量然后调用conv2d_transpose?它在哪里转置过滤器或输入?如何根据conv2d的填充模式SAMEVALID来计算输出张量的形状?

1 个答案:

答案 0 :(得分:0)

填充对conv2d_transpose意味着什么?

“ SAME” 意味着将输入形状乘以步幅即可。例如,如果输入形状的高度和宽度为7,而conv2d_transpose的padding = same并且strides = 3,则输出形状的高度和宽度将为7x3 = 21。

“有效” 几乎相同。从“ SAME”开始,然后检查kernel_size与步幅相比。如果较大,则将其加到高度和宽度上。为什么?因为当内核在整个图像上移动以进行卷积时(一次打击的数量),最后一个内核将通过该差值悬于图像上。想象一下上面的例子,输入的高度和宽度为7,这次填充为有效,步幅为3,内核为5。输出的高度和宽度将为7x3 +(5-3)。

在两种情况下,如果内核小于步幅,则输出中只会得到很多零。为什么?考虑一下大步向前...

对于给定的跨度值,输入图像会增加很多倍。跨度为3会使输入图像变宽3倍和更高。原始值排在第3位,其余填充为!对于padding = valid,我们前面已经讨论过了。

kernel_size是在图像上进行卷积的内核的大小,并通过跨步在图像上移动。因此,如果kernel_size为1且步幅为3,则您的输出大部分为零。

示例SAME

>>> conv2d_tr = tf.keras.layers.Conv2DTranspose(5,kernel_size=3,padding='same',strides=2)
>>> conv2d_tr(np.zeros([3,2,2,4],dtype=np.float32)).numpy().shape

(3, 4, 4, 5)

示例VALID(比步幅更大的内核)

>>> conv2d_tr = tf.keras.layers.Conv2DTranspose(5,kernel_size=3,padding='valid',strides=2)
>>> conv2d_tr(np.zeros([3,10,10,4],dtype=np.float32)).numpy().shape

(3, 21, 21, 5)

示例VALID(内核等于或小于步幅)

>>> conv2d_tr = tf.keras.layers.Conv2DTranspose(5,kernel_size=2,padding='valid',strides=2)
>>> conv2d_tr(np.zeros([3,2,2,4],dtype=np.float32)).numpy().shape

(3, 20, 20, 5)

示例ZEROS可使小内核大步向前

>>> conv2d_tr = tf.keras.layers.Conv2DTranspose(1,kernel_size=1,padding='same',strides=2)
>>> conv2d_tr(np.ones([1,2,2,3],dtype=np.float32)).numpy().shape
(1, 4, 4, 1)

>>> conv2d_tr(np.ones([1,2,2,3],dtype=np.float32)).numpy()

array([[[[0.702],[0.   ],[0.702],[0.   ]],
        [[0.   ],[0.   ],[0.   ],[0.   ]],
        [[0.702],[0.   ],[0.702],[0.   ]],
        [[0.   ],[0.   ],[0.   ],[0.   ]]]], dtype=float32)