[报错]ValueError: Incompatible shapes between op input and calculated input gradient. conv2d_transpose

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]。这时候就出现了上边的问题。那么解决这个问题就是改正:

  1. filter的尺寸;
  2. strides;
  3. 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中是行不通的。

Reference

谷歌API文档

你可能感兴趣的:(人工智能,tensorflow,深度学习)