python - 在 Tensorflow 中使用 3d 转置卷积时计算 output_shape

标签 python tensorflow computer-vision deep-learning convolution

我有一个来自上一层的 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' 那么我就不会收到错误。我读过convolutional arithmetic但不明白这些公式如何具体应用于 Tensorflow。

最佳答案

反卷积运算符很令人困惑,我认为每个人一开始都会被它们绊倒。 Here is a convenient set of gifs以 2D 形式可视化反卷积操作,该操作可以很好地转换为 3D。最容易想到的是两个步骤。

  1. 将图像上采样到更大的尺寸( tensorflow 通过填充零来实现此目的)
  2. 对上采样图像进行常规卷积

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

您有 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/

相关文章:

python - 如何使用python多次训练SVM分类器?

python - 用于查询哪个元素首先出现的 Python 列表的语法糖

python - Numpy hstack 爆内存

python - 使用keras进行预测时出现错误

TensorFlow安装错误: Operation not permitted . ../_markerlib

image-processing - 如何掩盖绿色像素?

python - 是什么导致我的矩阵向量乘法的 Cython 实现速度减慢 2 倍?

android - TensorFlow 对象检测在 Xamarin Android 上失败并出现 reshape 问题

python - 如何绘制遮挡/重叠物体的轮廓?

python - Scikit-image:如何减少断线段、重叠线?