2016-08-22 19 views
2

テンソルの流れでは、周期的な境界条件を持つ畳み込み(tf.nn.conv2d)を直接行うことはできません。テンソルフローの周期的なパディング

など。テンソルを取る

[[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"が大きく、フィルターが小さい場合、私には少し非効率なようです。または、テンソルフローは、実際にはbのすべての成分を計算する必要はないことがわかりますか? – Jens

+0

タイプミスがごめんね、それを修正しました。はい、この方法は、9枚の画像を作成し、それらのほとんどを捨てるので、非効率的です。 TensorFlowは現在、 'b'を実現することなく' result'を計算する最適化を持っていません。 – keveman

関連する問題