0

と仮定テンソルフローで2つの行列を畳み込む最良の方法は何ですか?

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

kernel_size = 2 * 2、ストライド= 1で畳み込む後、出力我々は、のすべての2×2部分 間の畳み込み演算を適用する必要が

[[18,18],[28,37]] 

なければなりませんBの2 * 2部分ごとに。 テンソルフローを使用してこの操作を効率的に実行する方法は? tensorflowにはこれを直接行う方法はありますか?

答えて

0

これはあなたにとって役立つかもしれません。

import numpy as np 
from scipy.signal import convolve2d 

def conv2(x, y, mode='same'): 
    return np.rot90(convolve2d(np.rot90(x, 2), np.rot90(y, 2), mode=mode), 2) 


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

print(conv2(A,B)) 

出力は

[[12 21 16] 
[27 45 33] 
[24 39 28]] 
+0

私はOPがtensorflowでそれを行うことを期待だと思います。また、あなたの出力はほとんどないようです。 – kmario23

+0

はい、私は2X2のカーネルを適用していないので、期待通りの出力が得られませんでした。 –

2

ここtf.nn.conv2Dを使用してそれを実行する一つの直接的な方法がありますようになります。

In [1055]: A = np.array([[1,2,3],[4,5,6],[7,8,9]]) 
     ...: B = np.array([[1,1,1],[1,1,1],[1,1,1]]) 
     ...: 

# define input tensor 
In [1056]: tfA = tf.constant(A, dtype=tf.float32) 

# reshape it to 4D tensor (as needed by tf.nn.conv2d) 
In [1057]: tfA = tfA[tf.newaxis, :, :, tf.newaxis] 

# define kernel tensor 
In [1058]: tfK = tf.constant(B, dtype=tf.float32) 

# again reshape it to 4D tensor (also, we use 2x2 convolution) 
In [1059]: tfK = tfK[:-1, :-1, tf.newaxis, tf.newaxis] 

# convolving the input tensor with kernel 
In [1060]: convolved = tf.nn.conv2d(tfA, tfK, strides=[1, 1, 1, 1], padding="VALID") 

In [1061]: convolved.eval() 
Out[1061]: 
array([[[[ 12.], 
     [ 16.]], 

     [[ 24.], 
     [ 28.]]]], dtype=float32) 

私はこれらのテンソルを評価するためにインタラクティブセッションを使用しますが、これは完璧に動作するはずです計算グラフを定義してから明示的なセッションを使用して後で実行する場合でも問題ありません。

EDITまた

、明確にするため、このアプローチは、任意の(2x2)カーネルテンソルBのために動作します。次の例では、カーネルテンソルのエントリが2倍になっているとします。予想通り、上記の例で得られた結果と比較すると最終結果も2倍になります。

もう一つの例:

In [110]: A = np.array([[1,2,3],[4,5,6],[7,8,9]]) 
In [111]: B = np.array([[2,2,2],[2,2,2],[2,2,2]]) 

In [112]: tfA = tf.constant(A, dtype=tf.float32) 
In [113]: tfA = tfA[tf.newaxis, :, :, tf.newaxis] 

In [114]: tfK = tf.constant(B, dtype=tf.float32) 
In [115]: tfK = tfK[:-1, :-1, tf.newaxis, tf.newaxis] 

In [116]: convolved = tf.nn.conv2d(tfA, tfK, strides=[1, 1, 1, 1], padding="VALID") 

In [117]: convolved.eval() 
Out[117]: 
array([[[[ 24.], 
     [ 32.]], 

     [[ 48.], 
     [ 56.]]]], dtype=float32) 
+0

Bは何でもかまいません。すべてのものである必要はありません。 – phkr

+0

はい、カーネルのテンソル "B"であれば十分です。 – kmario23

+0

@phkr説明のために別の例を追加しました。また、別のカーネルでテンソルを確認することをお勧めします:) – kmario23

関連する問題