【问题标题】:Difference between Tensorflow convolution and numpy convolutionTensorflow卷积和numpy卷积的区别
【发布时间】:2017-01-25 14:11:05
【问题描述】:
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 是相等的。

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

【问题讨论】:

  • 完全不同的数字。有些元素甚至符号不同。差异绝对是显着的

标签: python numpy tensorflow convolution


【解决方案1】:

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

  1. 用虚拟变量表示每个函数
  2. 反映功能之一(这是翻转)
  3. ..... 其他一些我不会在这里复制的东西。

TF 做所有事情,除了那个翻转。因此,您需要做的就是在 TF 或 numpy 中翻转内核。 1d 情况下的翻转只是内核的相反顺序,2d 需要翻转两个轴(将内核旋转 2 次)。

import tensorflow as tf
import numpy as np

I = [1, 0, 2, 3, 0, 1, 1]
K = [2, 1, 3]

i = tf.constant(I, dtype=tf.float32, name='i')
k = tf.constant(K, dtype=tf.float32, name='k')

data   = tf.reshape(i, [1, int(i.shape[0]), 1], name='data')
kernel = tf.reshape(k, [int(k.shape[0]), 1, 1], name='kernel')

res = tf.squeeze(tf.nn.conv1d(data, kernel, 1, 'VALID'))
with tf.Session() as sess:
    print sess.run(res)
    print np.convolve(I, K[::-1], 'VALID')

【讨论】:

  • TF 中的反向传播会发生什么?它会在那里翻转内核吗?
【解决方案2】:

过滤器的顺序颠倒了。 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')

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-06-12
    • 2017-11-14
    • 2019-05-06
    • 1970-01-01
    • 2017-10-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多