版权声明:本文为博主原创文章,未经博主允许不得转载。 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
计算反卷积的输出尺寸,反卷积就是卷积的逆过程,对于反卷积而言,卷积的输入就是反卷积的输出,根据上式求得i
除了上面求解输入输出尺寸的方法之外,还可以根据padding为SAME还是VALID来求解卷积的:输出
当padding为SAME时:
当padding为VALID时:
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)