Tensorflow卷积与numpy卷积之间的差异

时间:2017-01-25 14:11:05

标签: python numpy tensorflow convolution

import numpy as np
import tensorflow as tf

X_node    = tf.placeholder('float',[1,10,1])
filter_tf = tf.Variable( tf.truncated_normal([3,1,1],stddev=0.1) )

Xconv_tf_tensor = tf.nn.conv1d(X_node, filter_tf,1,'SAME')

X = np.random.normal(0,1,[1,10,1])
with tf.Session() as sess:
    tf.global_variables_initializer().run()
    feed_dict = {X_node: X}
    filter_np = filter_tf.eval()
    Xconv_tf = sess.run(Xconv_tf_tensor,feed_dict)
    Xconv_np = np.convolve(X[0,:,0],filter_np[:,0,0],'SAME')

我试图查看Tensorflow的卷积结果,以检查它是否按照我的意图行事。 当我运行numpy卷积并将其与Tensorflow卷积进行比较时,答案是不同的。 上面的代码是我运行测试的方式。 我希望Xconv_tfXconv_np相等。

我的最终目标是在具有1维滤波器的矩阵上运行2D卷积,该滤波器在每行上使用相同的滤波器运行1d卷积。为了使这项工作(基本上是行上的1d卷积循环),我需要弄清楚为什么我的np.convolvetf.conv1d给了我不同的答案。

2 个答案:

答案 0 :(得分:7)

你看到的问题是因为TF并没有真正计算卷积。如果您要查看convolution actually does(检查卷积的视觉解释)的解释,您将看到第二个函数被翻转:

  1. 根据虚拟变量
  2. 表达每个功能
  3. 反映其中一项功能(这是翻转)
  4. .....其他一些我不会复制的东西。
  5. 除了翻转之外,TF会做所有事情。所以你需要做的就是在TF或numpy中翻转内核。翻转1d的情况只是内核的逆序,2d你需要翻转两个轴(旋转内核2次)。

    customObject

答案 1 :(得分:3)

过滤器的顺序颠倒过来。 TensorFlow卷积实际上是相关性。 Numpy从数学中得到符号,TF从机器学习论文得到符号,并且某个地方的顺序被颠倒了。

这会打印True

filter_np2=filter_np[::-1,0,0]
np.allclose(np.convolve(X[0,:,0],filter_np2,'SAME'),  Xconv_tf.flatten())    np.convolve(X[0,:,0],filter_np2,'SAME')