2017-03-12 55 views
2

我有一些數據,我有一個二維數組A和一個內核K。我想計算這些的卷積。我如何在TensorFlow中做到這一點。看起來內置卷積運算採用4D張量作爲輸入,因爲他們假設我們正在計算具有多個顏色通道的批處理。我如何將這些操作與我的數據一起使用?二維數組的TensorFlow卷積

例子:

a = np.random.randint(2, size=(10,10)) 
k = [[1,1,1],[1,1,1],[1,1,1]] 
# Compute convolution of these?? 
c = ... 

回答

1
import tensorflow as tf 
import numpy as np 

a = np.random.randint(2, size=(10,10)) 
k = [[1,1,1],[1,1,1],[1,1,1]] 

tensor_a = tf.constant(a, tf.float32) 
tensor_k = tf.constant(k, tf.float32) 

tensor_res = tf.nn.convolution(tf.reshape(tensor_a, [1, 10, 10, 1]), tf.reshape(tensor_k, [3, 3, 1, 1]), padding='VALID') 

sess = tf.Session() 
print(sess.run(tensor_res)) 

計算圖表教程here

卷積幫手doc

1

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