2016-10-13 13 views
0

私は、ベクトルのバッチを取り、ブロードキャストで要素の賢明な減算を実行して、すべての組み合わせの間で異なる行列を得ることを試みています。私はこれを長さ1のバッチで動作させることができますが、サンプルの数を増やそうとすると、あらゆる種類の形状マッチングエラーが発生し、それがもう何年も放送されているとは思われません。ここで1つのバッチの作業を取得するサンプルコード、と私は2作業のバッチを取得するには成功せずにしようとしたいくつかの他の入力は次のとおりです。ベクトルのバッチブロードキャストを要素単位の計算で

import tensorflow as tf 

#initx = [[1.0, 2.0, 3.0, 4.0],[1.0, 2.0, 3.0, 4.0]] 
#initx = [[[1.0, 2.0, 3.0, 4.0]],[[1.0, 2.0, 3.0, 4.0]]] 
initx = [[1.0, 2.0, 3.0, 4.0]] 

x = tf.placeholder(dtype=tf.float32) 

deltas = tf.sub(x,tf.transpose(x)) 

reshaped_deltas = tf.reshape(deltas,[-1]) 

with tf.Session('') as session: 
    session.run(tf.initialize_all_variables()) 

    print "Delta:",session.run([deltas],feed_dict={x:initx }) 
    print "Flattened Output:",session.run([reshaped_deltas],feed_dict={x:initx }) 

私は単一例えば予想される結果を得る:

Delta: [array([[ 0., 1., 2., 3.], 
     [-1., 0., 1., 2.], 
     [-2., -1., 0., 1.], 
     [-3., -2., -1., 0.]], dtype=float32)] 
Flattened Output: [array([ 0., 1., 2., 3., -1., 0., 1., 2., -2., -1., 0., 1., -3., 
     -2., -1., 0.], dtype=float32)] 

「tf.sub()」関数をバッチで処理する方法を理解できず、各バッチに対して[1,4]ベクトルを適切にブロードキャストしています。

誰でもこれを行う方法を知っていますか?私はtf.batch_matmul()があることを知っていますが、問題を解決する可能性のあるbatch_sub()はありません。

EDIT:ヤロスラフBulatovのフィードバック

import tensorflow as tf 

initx = [[1.5, 2.0, 3.0, 4.0],[1.0, 2.0, 3.0, 4.0]] 
#initx = [[1.0, 2.0, 3.0, 4.0]] 

VectorSize = len(initx[1]) 

x = tf.placeholder(dtype=tf.float32) 

batch1 = tf.reshape(x, (-1,VectorSize, 1)) 
deltas = tf.sub(batch1, tf.transpose(batch1, (0, 2, 1))) 

reshaped_deltas = tf.reshape(deltas,[-1]) 

with tf.Session('') as session: 
    session.run(tf.initialize_all_variables()) 

    print "Delta:",session.run([deltas],feed_dict={x:initx }) 
    print "Flattened Output:",session.run([reshaped_deltas],feed_dict={x:initx }) 

答えて

2

に基づいて問題を解決するためのスクリプトを更新しましたが、あなたのバッチサイズはnであり、あなたのデータサイズはkであると仮定します。 subへの入力がn, k, 1n, 1, kの場合、ブロードキャストはシングルトンのディメンションを塗りつぶして、形状の出力結果をn, k, kにします。 tf.reshapeを使用してオリジナルをn, k, 1tf.transpose(..., perm=(0, 2, 1))に変更してn, 1, kの形状にすることができます。 IEのようなもの

x1 = tf.constant([1,2,3]) 
x2 = tf.constant([4,4,5]) 
batch = tf.pack([x1,x2]) 
n = 2 
k = 3 
batch1 = tf.reshape(batch, (n, k, 1)) 
sess = tf.Session() 
sess.run(tf.sub(batch1, tf.transpose(batch1, (0, 2, 1)))) 

Out[] = array([[[ 0, -1, -2], 
     [ 1, 0, -1], 
     [ 2, 1, 0]], 

     [[ 0, 0, -1], 
     [ 0, 0, -1], 
     [ 1, 1, 0]]], dtype=int32) 
関連する問題