2016-08-22 82 views
2

在張量流中,我無法找到一個簡單的可能性來執行具有周期性邊界條件的卷積(tf.nn.conv2d)。tensorflow定期填充

E.g.採取張量

[[1,2,3], 
[4,5,6], 
[7,8,9]] 

和任何3x3過濾器。週期性邊界條件卷積原則上可以做一個定期的填充來實現,以5X5

[[9,7,8,9,7], 
[3,1,2,3,1], 
[6,4,5,6,4], 
[9,7,8,9,7], 
[3,1,2,3,1]] 

,隨後卷積在「有效」過濾器。但是,函數tf.pad不幸地不支持週期性填充。

有沒有簡單的解決方法?

回答

3

以下應工作你的情況:

import tensorflow as tf 
a = tf.constant([[1,2,3],[4,5,6],[7,8,9]]) 
b = tf.tile(a, [3, 3]) 
result = b[2:7, 2:7] 
sess = tf.InteractiveSession() 
print(result.eval()) 

# prints the following 
array([[9, 7, 8, 9, 7], 
     [3, 1, 2, 3, 1], 
     [6, 4, 5, 6, 4], 
     [9, 7, 8, 9, 7], 
     [3, 1, 2, 3, 1]], dtype=int32) 

正如在評論中指出,這是在內存方面有點效率低下。如果內存對你來說是一個問題,但願意花費一些計算,下面也將工作:

pre = tf.constant([[0, 0, 1], [1, 0, 0], [0, 1, 0], [0, 0, 1], [1, 0, 0]]) 
post = tf.transpose(pre) 
result = tf.matmul(tf.matmul(pre, a), post) 
print(result.eval()) 
+0

很多謝謝!正常工作(除了它應該是result.eval())。但是,如果「a」很大並且過濾器很小,這對我來說似乎有點低效。或者tensorflow能夠發現它實際上並不需要計算b的所有組件? – Jens

+0

抱歉,錯字,修復它。是的,這種方法效率不高,因爲它創建了9個圖像副本並丟棄了大部分圖像。 TensorFlow目前沒有可以在沒有實現'b'的情況下計算'結果'的優化。 – keveman