在 Tensorflow 中使用 3D 转置卷积时计算output_shape



我有一个来自前一层的 4D 张量h0,形状为[10, 1, 1, 1, 10],我想使用conv3d_transpose对具有形状的张量h1进行上采样,比如说,[10, 4, 4, 4, 20].

我不明白我选择filterstridespadding效果如何output_shape,给定h0,因此[10, 4, 4, 4, 20]是否可能h1是否有经验法则或公式?

例如,如果我运行以下内容:

import tensorflow as tf
sess = tf.Session()
# Input (previous layer) [batch, depth, height, width, in_channels]
h0 = tf.constant(0.1, shape=[10, 1, 1, 1, 10])
# Filter [depth, height, width, output_channels, in_channels]
w1 = tf.constant(0.1, shape=[5, 5, 5, 20, 10])
# Strides [1, depth, height, width, 1]
strides1 = [1, 4, 4, 4, 1]
# Output shape [batch, depth, height, width, in_channels]
output_shape1 = [10, 4, 4, 4, 20]
# Current layer
h1 = tf.nn.conv3d_transpose(value = h0, 
filter = w1,    
output_shape = output_shape1, 
strides = strides1, 
padding = 'VALID')
sess.close()

我收到错误:

InvalidArgumentError: Conv3DBackpropInput: Number of planes of out_backprop doesn't 
match computed: actual = 1, computed = 0

但是如果我更改padding = 'SAME'那么我就不会出错。我读过卷积算术,但不明白这些公式如何具体应用于Tensorflow。

Deconv 运算符令人困惑,我认为每个人最初都会被它们绊倒。这是一组方便的 gif,用于在 2D 中可视化 deconv 操作,它可以很好地转移到 3D 中。最容易想到的是两个步骤。

  1. 将图像上采样到更大的尺寸(Tensorflow通过填充零来做到这一点)
  2. 对该上采样图像进行常规卷积

话虽如此,让我们看看您的示例中发生了什么。

你有 d, w, h = [1, 1, 1],你想把它"反卷积"到 [4, 4, 4, 4] 的深度、宽度、高度。您正在使用 [5, 5, 5] 滤波器执行此操作,该滤波器在 d、w、h 维度上以 [4, 4, 4] 的步幅移动。

引擎盖下的第一步是将图像放大到更大的尺寸(它自己决定有多大),其方式类似于引用的 gif。这样,我们就能够对这些被放大的图像进行定期卷积。然后,你把你的[5,5,5]过滤器,并在64个不同的位置应用它(由于你的4,4,4 output_shape)。这些位置将彼此相距 4、4、4,因为这是您指定的步幅。为了使这些形状发挥作用,在图像大小调整过程中,初始图像需要放大到[17,17,17]。证明留给读者作为练习(也就是,我懒得画然后链接解释,但如果你愿意,可以这样做)。

"相同"标签基本上是说忽略输入层和输出层形状的细节。它用零填充输入的边框,因此一切都别无选择,只能解决。如果未指定"相同",则需要对形状严格要求,否则它们将无法按照您希望的方式很好地出现。老实说,在你适应卷积/反卷积之前,我建议你坚持使用"相同"标签,让你的生活更轻松。

另外,你们的步伐/output_shape/filter_size在一起并没有真正的意义。将 [1, 1, 1] 图像放大到必要的 [17, 17, 17] 只会用零填充 [17, 17, 17] 图像,除了该中心点。因此,大多数过滤器将处理所有这些零,并且会弄乱您的输出。相反,我建议做一些类似strides=[1, 1, 1], output_shape=[10, 3, 3, 3, 20], w1(aka filter_size)=[3, 3, 3, 20, 10] 之类的事情。使用"相同"标签,应该会在下一个网络层中为您提供一些合理的结果。这只会将过滤器移动 1 步幅,用于 27 个点(也称为 3x3x3 output_shape点)。这意味着这 27 个中的每一个都将包含信息,而不仅仅是零。

祝你好运!

最新更新