答案为止发布的所有错过了一个重要的观点:Tensorflow不不计算一个卷积,但互相关正如在中所述doc:
注意的是,虽然这些老年退休金计划被称为“回旋”,他们是 严格说来“互相关”由于过滤器无需反转滤波器结合 与输入窗口。
如果真要计算的卷积,你将有传递到conv2d
之前扭转内核,即一旦上了水平翻转,然后在垂直轴上。用仪的回答,这可能是这样的:
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实际计算卷积,就必须翻转它。