tensorflow报InvalidArgumentError (see above for traceback): Conv2DSlowBackpropInput

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/sinat_29957455/article/details/85547607

在使用TensorFlow求解转置卷积(反卷积)的时候,我们需要调用tf.nn.conv2d_transpose方法,在计算反卷积的时候,报了如下错误

InvalidArgumentError (see above for traceback): Conv2DSlowBackpropInput: Size of out_backprop doesn't match computed: actual = 3, computed = 5spatial_dim: 1 input: 5 filter: 3 output: 3 stride: 1 dilation: 1

报错代码如下:

if __name__ == "__main__":
    x1 = tf.constant([i*0.1 for i in range(9)],shape=[1,3,3,1],dtype=tf.float32)
    dev_con1 = tf.ones(shape=[3,3,1,1],dtype=tf.float32)
    y1 = tf.nn.conv2d_transpose(x1,dev_con1,output_shape=[1,5,5,1],strides=[1,1,1,1],padding="SAME")
    sess = tf.InteractiveSession()
    tf.global_variables_initializer()
    y1 = sess.run(y1)
    print(y1)

原因分析:

从错误的原因来看是因为输入矩阵与输出矩阵大小不匹配导致的,在使用tf.nn.conv2d_transpose方法的时候,TensorFlow 会根据output_shape、strides、padding、kernel的参数来求解输入的shape,如果不匹配就会报错。下面介绍几个公式,如何根据这些参数来计算输入和输出:

  • o:表示卷积的输出矩阵的尺寸
  • s:表示卷积的步长
  • i:表示卷积的输入矩阵的尺寸
  • p:表示padding的大小
  • k:表示卷积核的大小

计算卷积的输出尺寸,已知卷积输入矩阵的大小i,以及s、p、k等参数,求解o

o=\frac{i-k+2*p}{s} + 1

计算反卷积的输出尺寸,反卷积就是卷积的逆过程,对于反卷积而言,卷积的输入就是反卷积的输出,根据上式求得i

i=(o-1) * s +k - 2*p

除了上面求解输入输出尺寸的方法之外,还可以根据padding为SAME还是VALID来求解卷积的:输出

当padding为SAME时:

o=ceil(i/s)

当padding为VALID时:

o=ceil((i-k+1)/2)

ceil函数表示,向上去整

修改方法:

根据padding为SAME时的公式,当不改变步长s的时候,已知输出的矩阵尺寸为5,所以输入的矩阵尺寸应该也为5,修正后的代码如下:

if __name__ == "__main__":
    x1 = tf.constant([i*0.1 for i in range(25)],shape=[1,5,5,1],dtype=tf.float32)
    dev_con1 = tf.ones(shape=[3,3,1,1],dtype=tf.float32)
    y1 = tf.nn.conv2d_transpose(x1,dev_con1,output_shape=[1,5,5,1],strides=[1,1,1,1],padding="SAME")
    sess = tf.InteractiveSession()
    tf.global_variables_initializer()
    y1 = sess.run(y1)
    print(y1)

当不修输入尺寸的大小时,可以将步长修改为2,修正后的代码如下:

if __name__ == "__main__":
    x1 = tf.constant([i*0.1 for i in range(9)],shape=[1,3,3,1],dtype=tf.float32)
    dev_con1 = tf.ones(shape=[3,3,1,1],dtype=tf.float32)
    y1 = tf.nn.conv2d_transpose(x1,dev_con1,output_shape=[1,5,5,1],strides=[1,2,2,1],padding="SAME")
    sess = tf.InteractiveSession()
    tf.global_variables_initializer()
    y1 = sess.run(y1)
    print(y1)

猜你喜欢

转载自blog.csdn.net/sinat_29957455/article/details/85547607
今日推荐