为什么这个Conv2d_Transpose / deconv2d在tensorflow中返回原始输入?

时间:2016-06-17 22:02:15

标签: tensorflow convolution deconvolution

weights = tf.placeholder("float",[5,5,1,1])
imagein = tf.placeholder("float",[1,32,32,1])
conv = tf.nn.conv2d(imagein,weights,strides=[1,1,1,1],padding="SAME")
deconv = tf.nn.conv2d_transpose(conv, weights, [1,32,32,1], [1,1,1,1],padding="SAME")


dw = np.random.rand(5,5,1,1)
noise = np.random.rand(1,32,32,1)

sess = tf.InteractiveSession()

convolved = conv.eval(feed_dict={imagein: noise, weights: dw})
deconvolved = deconv.eval(feed_dict={imagein: noise, weights: dw})

我一直试图找出conv2d_transpose以便在Tensorflow中反转卷积。我的理解是"去卷积"应包含与"噪音相同的数据"在应用正常卷积然后进行转置后,但是"去卷积"只是包含一些完全不同的图像。我的代码有问题,还是理论不正确?

1 个答案:

答案 0 :(得分:4)

有一个原因叫它conv2d_transpose而不是deconv2d:它不是反卷积。卷积不是正交变换,因此它的逆(解卷积)与其转置(conv2d_transpose)不同。

你的困惑是可以理解的:调用卷积转换“deconvolution”多年来一直是标准的神经网络实践。我很高兴我们能够在TensorFlow中修改名称在数学上是正确的;更多详情:

https://github.com/tensorflow/tensorflow/issues/256