我有一个来自上一层的 4D 张量 h0
,形状为 [10, 1, 1, 1, 10]
,我想使用 conv3d_transpose 进行上采样
到具有形状的张量 h1
,比方说,[10, 4, 4, 4, 20]
。
我不明白我选择的filter
、strides
和padding
如何影响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'
那么我就不会收到错误。我读过convolutional arithmetic但不明白这些公式如何具体应用于 Tensorflow。
最佳答案
反卷积运算符很令人困惑,我认为每个人一开始都会被它们绊倒。 Here is a convenient set of gifs以 2D 形式可视化反卷积操作,该操作可以很好地转换为 3D。最容易想到的是两个步骤。
- 将图像上采样到更大的尺寸( tensorflow 通过填充零来实现此目的)
- 对上采样图像进行常规卷积
话虽如此,让我们看看您的示例中发生了什么。
您有 d, w, h = [1, 1, 1],并且想要将其“反卷积”至深度、宽度、高度为 [4, 4, 4]。您正在使用 [5, 5, 5] 过滤器执行此操作,该过滤器在 d、w、h 维度中以 [4, 4, 4] 的步幅移动。
幕后的第一步是将图像放大到更大的尺寸(它自行决定有多大),其方式类似于引用的 gif。这样,我们就能够对这些放大的图像进行常规卷积。然后,您采用 [5, 5, 5] 过滤器,并将其应用到 64 个不同的位置(由于您的 4, 4, 4 输出形状)。这些位置彼此相距 4, 4, 4,因为这是您指定的步幅。为了使这些形状发挥作用,在图像调整大小过程中需要将初始图像放大到 [17, 17, 17]。证明留给读者作为练习(也就是说,我懒得画出然后链接解释,但如果你愿意的话可以这样做)。
“相同”标签基本上表示忽略输入层和输出层形状的具体细节。它用零填充输入的边框,因此一切都别无选择,只能解决。如果未指定“相同”,则您需要对形状严格要求,否则它们将不会按照您希望的方式很好地显示出来。老实说,在您熟悉卷积/反卷积之前,我建议您坚持使用“相同”标签,以使您的生活更轻松。
另外一点,你的 strides/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 ]。使用“相同”标签,应该会在下一个网络层中为您提供一些合理的结果。对于 27 个点(也称为 3x3x3 输出形状点),这只会将过滤器移动 1 步长。这意味着这 27 个中的每一个都将包含信息,而不仅仅是零。
祝你好运!
关于python - 在 Tensorflow 中使用 3d 转置卷积时计算 output_shape,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48449847/