ここ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)
私はOPがtensorflowでそれを行うことを期待だと思います。また、あなたの出力はほとんどないようです。 – kmario23
はい、私は2X2のカーネルを適用していないので、期待通りの出力が得られませんでした。 –