我有一个4D张量h0
来自上一个形状为[10, 1, 1, 1, 10]
的图层,我想使用conv3d_transpose
上采样到具有形状的张量h1
,让我们说,{ {1}}。
我不明白我选择的[10, 4, 4, 4, 20]
,filter
和strides
如何影响padding
,output_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。
答案 0 :(得分:1)
Deconv运营商感到困惑,我认为每个人最初都会被他们绊倒。 Here is a convenient set of gifs可以在2D中可视化deconv操作,可以很好地转换为3D。最简单的想法是两个步骤。
话虽如此,让我们看看你的例子中发生了什么。
你有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个中的每一个都会有信息进入它,而不仅仅是零。
祝你好运!