私は、ベクトルのバッチを取り、ブロードキャストで要素の賢明な減算を実行して、すべての組み合わせの間で異なる行列を得ることを試みています。私はこれを長さ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 })