如何理解tensorflow中的conv2d_transpose

How to understand the conv2d_transpose in tensorflow

以下是对conv2d_transpose的测试。

import tensorflow as tf
import numpy as np
x = tf.constant(np.array([[
    [[-67], [-77]], 
    [[-117], [-127]]
]]), tf.float32)

# shape = (3, 3, 1, 1) -> (height, width, input_channels, output_channels) - 3x3x1 filter
f = tf.constant(np.array([
    [[[-1]], [[2]], [[-3]]], 
    [[[4]], [[-5]], [[6]]], 
    [[[-7]], [[8]], [[-9]]]
]), tf.float32)

conv = tf.nn.conv2d_transpose(x, f, output_shape=(1, 5, 5, 1), strides=[1, 2, 2, 1], padding='VALID')

结果:

tf.Tensor(
[[[[   67.]
   [ -134.]
   [  278.]
   [ -154.]
   [  231.]]

  [[ -268.]
   [  335.]
   [ -710.]
   [  385.]
   [ -462.]]

  [[  586.]
   [ -770.]
   [ 1620.]
   [ -870.]
   [ 1074.]]

  [[ -468.]
   [  585.]
   [-1210.]
   [  635.]
   [ -762.]]

  [[  819.]
   [ -936.]
   [ 1942.]
   [-1016.]
   [ 1143.]]]], shape=(1, 5, 5, 1), dtype=float32)  

根据我的理解,它应该像 doc

中的图 4.5 中描述的那样工作

因此第一个元素(conv[0,0,0,0])应该是-67*-9=603。为什么结果是67?

结果可以用下图来解释:。但是为什么卷积核是反的呢?

为了更好地解释,我做了一个draw.io图来解释你得到的结果。

我想上面的插图可能有助于解释转置转换的第一个元素的原因。特征图是 67.

需要注意的关键事项:

  • 与传统卷积不同,在转置卷积中,过滤器的每个元素都与输入特征图的一个元素相乘,这些单独乘法的结果和中间特征图被叠加彼此创建最终的特征图。 stride 确定叠加层之间的距离。在我们的例子中,stride = 2,因此在每次与原始下采样特征图卷积后,过滤器在 xy 维度上移动 2。