ValueError: Incompatible shapes between op input and calculated input gradient. Forward operation: deconv1d/conv2d_transpose.
Date: 2019.12.29
Author: Xin Pan
问题
ValueError: Incompatible shapes between op input and calculated input gradient. Forward operation: deconv_block_128/deconv1d/conv2d_transpose. Input index: 2. Original input shape: (512, 11, 14, 256). Calculated input gradient shape: (512, 11, 24, 256)
看起来这个问题是说conv2d_transpose的输入和计算(input)的输入梯度(input gradient)之前存在不匹配的问题。
解决
经过尝试之后解决这个问题很简单。首先看这个函数:
tf.nn.conv2d_transpose(
value,
filter,
output_shape,
strides,
padding='SAME',
data_format='NHWC',
name=None
)
我们需要让value经过filter卷积之后的尺寸和output_shape一致即可。在问题中我的value在图的编译阶段是[512,11,24,256],output_shape也是[512,11,24,256]。它们是匹配的,但是当用sess.run()运行的时候我input的尺寸变成了[512,11,14,256]。这时候就出现了上边的问题。那么解决这个问题就是改正:
- filter的尺寸;
- strides;
- padding=“SAME” ->padding=“VALID”
以上方式任选或者几个方式的组合,都可以解决。这样问题就可以解决了。
详细推理
在用tensorflow-gpu==1.12.0 写一个反卷积的程序。上网搜索了一下tensorflow里边的反卷积用tf.nn.conv2d_transpose实现的。看了下tensorflow官网上的解释,只是说这个函数能起到类似的作用,但是和反卷积并不完全一致(具体的推理还未深究,下周研究一下)
tf.nn.conv2d_transpose(
value,
filter,
output_shape,
strides,
padding='SAME',
data_format='NHWC',
name=None
)
这个函数的几个参数,value 是输入,filter是需要使用的卷积核,strides是滑动的步长,padding是边界的处理方式,
最关键的就是output_shape这个参数,而且这个参数是必不可少的。我看到网上一些文章说可以将output_shape的第一维度改成-1或是None就是变成[-1(None), 22,33,4]这样,但是这个方法在conv2d_transpose中是行不通的。