2017-11-08 1 views
0

conv1d:1次元フィーチャに関する2つの簡単な例: [2,1,3]によって畳み込まれた[2,1,3]、出力は[ 8. 11. 7. 9. 4.]、これが正しいです。しかし、2次元フィーチャの場合、「[[1,0,2,3,1,1,1]、[1,0,2,3,0,1,1]]」「[[2、 1、3]、[2、1、3]] "出力すべきである" [[8. 11. 7. 9. 4]、[簡単な例の問題

しかし、プログラムの出力:

[[ 2. 1. 3.] 
[ 10. 5. 15.] 
[ 2. 1. 3.] 
[ 4. 2. 6.] 
[ 4. 2. 6.] 
[ 6. 3. 9.] 
[ 4. 2. 6.]] 

問題がありますか?すべてのヘルプは理解されるであろう。*

import tensorflow as tf 
i = tf.constant([1, 0, 2, 3, 0, 1, 1], dtype=tf.float32, name='i') 
print(i.shape) 
ii = tf.constant([[1, 0, 2, 3, 0, 1, 1],[1, 0, 2, 3, 0, 1, 1]]) 
print(ii.shape) 
k = tf.constant([2, 1, 3], dtype=tf.float32, name='k') 
k2 = tf.constant([[2, 1, 3], [2, 1, 3]], dtype=tf.float32, name='k') 
print(k2.shape) 

data = tf.reshape(i, [1, int(i.shape[0]), 1], name='data') 
data2 = tf.reshape(ii, [1, int(i.shape[0]), 2], name='data') 

kernel = tf.reshape(k, [int(k.shape[0]), 1, 1], name='kernel') 
kernel2 = tf.reshape(k2, [1, int(k2.shape[0]), 3], name='kernel') 
print(kernel2) 

res = tf.squeeze(tf.nn.conv1d(data, kernel, 1, 'VALID')) 
res2 = tf.squeeze(tf.nn.conv1d(data2, kernel2, 1, 'VALID')) 

with tf.Session() as sess: 
    print(sess.run(kernel2)) 
    print sess.run(res) 
    print sess.run(res2) 
+0

特集:[[1、0、2、3、0をあなたが言及した結果を取得したい場合(FE [2,7,2])

はこのように、コードは、次のようにする必要があります、[1,1、]、[1,0,2,3,0,1,1]フィルター:[[2,1,3]、[2,1,3]] – void

+0

'data2'の値を印刷してみてください。 。私はそれがあなたが期待しているものとは違うと思う。 – Sunreef

答えて

1

1)tf.nn.conv1dのデフォルトの入力形式は、[バッチ、in_width、in_channels]で、あなたのケースでは、それは[2,7,1](DATA2用)

です

2)畳み込みカーネルは同じバッチであるため、の異なるカーネルをの異なるカーネルに適用しないと、出力にチャネルが増えない限り、各バッチに対してカーネルを複製する必要はありません。

k = tf.constant([2, 1, 3], dtype=tf.float32, name='k') 

data = tf.reshape(i, [1, int(i.shape[0]), 1], name='data') 
data2 = tf.reshape(ii, [2, int(i.shape[0]), 1], name='data2') 

kernel = tf.reshape(k, [int(k.shape[0]), 1, 1], name='kernel') 

res = tf.squeeze(tf.nn.conv1d(data, kernel, 1, 'VALID')) 
res2 = tf.squeeze(tf.nn.conv1d(data2, kernel, 1, 'VALID')) 
+0

あなたの明確な答えをありがとう。しかし、私は次の操作を実装したいと思います。機能の各行(私の例では2行)は、別のカーネル(ここでは2つのカーネルがあります)と畳み込まれます。あなたはこれを行う方法を説明するのを助けることができますか? [[1,2,3,3、0,1,1]、[1,2,3,5,1,1]] XX [[1,1,3]、[4,1,2] ] ==> [[8. 11. 7. 9. 4.]、[11. 20. 21. 19 23.]]異なる入力を異なるカーネルに適用することができます。 [[1,1,0,2,3,0,1,1]、[1,3,2,3,5,1,1]]は2D画像である[[2,1,3]、[4,1] 1、2]]は2Dカーネルです – void

+0

@voidよく、別の操作に分けるのが最善の方法です。または、一度にそれらを実行したい場合は、後でスライシングを実装し、4つのアウトプットのうち2つをスライスしますが、これは面倒です。 tf.nn.conv1dの実装全体は、これらの入力とカーネルを2つの行列の積に変換することによって、複数のバッチに対するコンボリューション演算を最適化するように設計されています。 – asakryukin

+0

@voidこれは、カーネルを[number_ofkernels、kernel width]行列に変換し、[batch、kernels_size、number_of_receptive_fields]に入力することで実装されます。テンソルフローライブラリを使ってすべての画像にすべてのカーネルを適用することを避ける方法はありません。一方、私は本当になぜそれが必要なのか分かりません。これはニューラルネットワークの一般的な方法ではないので、tf.nnライブラリには直面していません。 – asakryukin