到目前为止发布的答案都错过了一个重要点:Tensorflow 不计算卷积,而是计算交叉相关,如 doc 中所述:
请注意,虽然这些操作称为“卷积”,但它们是
严格来说是“互相关”,因为滤波器是组合的
带有输入窗口而不反转过滤器。
如果您真的想计算卷积,则必须先反转内核,然后再将其传递给conv2d,即在水平轴上翻转一次,然后在垂直轴上翻转一次。使用 Miriam 的答案,这可能看起来像这样:
import tensorflow as tf
import numpy as np
a = np.random.randint(2, size=(10,10))
k = np.array([[1,1,1],[1,1,1],[1,1,1]],dtype=np.float32)
flip = [slice(None, None, -1), slice(None, None, -1)]
k = k[flip]
a=a.astype(np.float32)
a_tensor = tf.reshape(a, [1, 10, 10, 1])
k_weight = tf.reshape(np.array(k), [3,3,1,1])
c=tf.nn.conv2d(a_tensor, k_weight,padding='VALID',strides=[1, 1, 1, 1])
sess=tf.Session()
c.eval(session=sess)
请注意,在这个特定示例中,翻转内核在技术上是徒劳的,因为对于对称内核,卷积和互相关是一回事。然而,一旦你有了一个非对称内核,如果你想让 Tensorflow 实际计算卷积,就必须翻转它。