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

时间:2018-01-25 18:44:58

标签: python tensorflow computer-vision deep-learning convolution

我有一个4D张量h0来自上一个形状为[10, 1, 1, 1, 10]的图层,我想使用conv3d_transpose上采样到具有形状的张量h1,让我们说,{ {1}}。

我不明白我选择的[10, 4, 4, 4, 20]filterstrides如何影响paddingoutput_shape,因此h0 1 {}可以[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 那么我就没有错误。我已经阅读了convolutional arithmetic,但不明白公式如何适用于Tensorflow。

1 个答案:

答案 0 :(得分:1)

Deconv运营商感到困惑,我认为每个人最初都会被他们绊倒。 Here is a convenient set of gifs可以在2D中可视化deconv操作,可以很好地转换为3D。最简单的想法是两个步骤。

  1. 将图像采样到更大的尺寸(张量流通过填充零来实现)
  2. 对该上采样图像进行常规卷积
  3. 话虽如此,让我们看看你的例子中发生了什么。

    你有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 output_shape)。这些位置将彼此分开4,4,4,因为这是您指定的步伐。为了使这些形状成形,初始图像需要在图像尺寸调整过程中被炸成[17,17,17]。证据留给读者作为练习(也就是说,我懒得画画然后链接一个解释,但如果你愿意的话可以这样做。)

    '相同' tag基本上都说要忽略输入层和输出层形状的细节。它用零填充输入的边界,所以一切都别无选择,只能解决问题。如果相同'没有指定,你需要对形状严格要求,否则它们不会像你想要的那样顺利出现。老实说,在你对卷积/解卷积感到满意之前,我建议你坚持使用相同的'相同的'标记让你的生活更轻松。

    另外,你的strides / output_shape / filter_size并不是很有意义。将[1,1,11]图像放到必要的[17,17,17]将只用零填充[17,17,17]图像,除了该中心点。因此,大多数过滤器将处理所有这些零,并且它会使您的输出混乱。我建议改为做strides = [1,1,1],output_shape = [10,3,3,3,20],w1(又名filter_size)= [3,3,3,20] ,10]。那个,同样的'标签,应该在下一个网络层给你一些合理的结果。对于27个(也称为3x3x3 output_shape点)中的每一个,这只会将滤波器移动1步。这意味着这27个中的每一个都会有信息进入它,而不仅仅是零。

    祝你好运!