2017-01-25 24 views
3
import numpy as np 
import tensorflow as tf 

X_node = tf.placeholder('float',[1,10,1]) 
filter_tf = tf.Variable(tf.truncated_normal([3,1,1],stddev=0.1)) 

Xconv_tf_tensor = tf.nn.conv1d(X_node, filter_tf,1,'SAME') 

X = np.random.normal(0,1,[1,10,1]) 
with tf.Session() as sess: 
    tf.global_variables_initializer().run() 
    feed_dict = {X_node: X} 
    filter_np = filter_tf.eval() 
    Xconv_tf = sess.run(Xconv_tf_tensor,feed_dict) 
    Xconv_np = np.convolve(X[0,:,0],filter_np[:,0,0],'SAME') 

Tensorflowの畳み込みの結果を見て、意図したとおりに動作しているかどうかを確認しようとしています。 numpyコンボリューションを実行し、それをTensorflowコンボリューションと比較すると、答えが異なります。 上記のコードは、私がテストを実行した方法です。 私はXconv_tfXconv_npが等しいと思っていました。Tensorflow畳み込みとnumpy畳み込みの違い

私の最終的な目標は、同じフィルタを使用して各行に1d畳み込みを実行する1次元フィルタを使用した行列上で2D畳み込みを実行することです。この作業(基本的に行間の1d畳み込みのループになります)を行うには、なぜ私のnp.convolvetf.conv1dが私に異なる答えを与えるのかを理解する必要があります。

+0

完全に異なる数字。いくつかの要素は記号が異なっています。その違いは間違いなく重要です –

答えて

3

を印刷します。あなたはconvolution actually doesは(コンボリューションのビジュアル解説をチェック)何の説明を見てみましょう場合は、第二の機能が反転していることがわかります。

  1. エクスプレスの各機能をダミー変数
  2. の面で
  3. 機能の1つを反映(これはフリップです)
  4. .....私はここでコピーしません他のもの。

TFはそのフリップを除くすべてを行います。だから、あなたがする必要があるのは、カーネルをTFかnumpyのどちらかにフリップすることだけです。 1dの場合の反転はカーネルの逆順で行われます.2dの場合、両方の軸を反転する必要があります(カーネルを2回回転させる)。

import tensorflow as tf 
import numpy as np 

I = [1, 0, 2, 3, 0, 1, 1] 
K = [2, 1, 3] 

i = tf.constant(I, dtype=tf.float32, name='i') 
k = tf.constant(K, dtype=tf.float32, name='k') 

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

res = tf.squeeze(tf.nn.conv1d(data, kernel, 1, 'VALID')) 
with tf.Session() as sess: 
    print sess.run(res) 
    print np.convolve(I, K[::-1], 'VALID') 
2

フィルタの順序が逆になります。 TensorFlowの畳み込みは、実際には相関関係です。 Numpyは数学から記法を取得し、TFは機械学習の論文から表記を取得し、注文は逆転した。

これは、TFは本当に畳み込みを計算していないので、あなたが見る問題があるTrue

filter_np2=filter_np[::-1,0,0] 
np.allclose(np.convolve(X[0,:,0],filter_np2,'SAME'), Xconv_tf.flatten()) np.convolve(X[0,:,0],filter_np2,'SAME') 
関連する問題