答案爲止發佈的所有錯過了一個重要的觀點: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實際計算卷積,就必須翻轉它。