【问题标题】:How to understand the conv2d_transpose in tensorflow如何理解 tensorflow 中的 conv2d_transpose
【发布时间】:2020-01-26 13:55:58
【问题描述】:

以下是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?

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

【问题讨论】:

    标签: tensorflow deconvolution


    【解决方案1】:

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

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

    需要注意的关键点:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多