2017-04-17 6 views
1

最初に私は別の質問を見つけましたNo broadcasting for tf.matmul in TensorFlow
しかし、その質問は私の問題を解決しません。4D 3Dテンソルのテンソルフローのtf.matmulの放送がありません

私の問題は、行列のバッチがベクトルの別のバッチを乗算することです。

x=tf.placeholder(tf.float32,shape=[10,1000,3,4]) 
y=tf.placeholder(tf.float32,shape=[1000,4]) 

xはmatrices.Thereのバッチで10×1000 matrices.Eachマトリックス形状であるれる[3,4]
yはvectors.Thereのバッチ1000 vectors.Eachベクトルは形状であります[4]
xのdim 1とyのdim 0は同じです。 tf.matmul放送をサポートしていた場合、私は

y=tf.reshape(y,[1,1000,4,1]) 
result=tf.matmul(x,y) 
result=tf.reshape(result,[10,1000,3]) 

を書くことができしかし、私は、私は

上で参照し、質問のアプローチを使用している場合は
を放送tf.matmulサポートしていません
(ここでは1000)
x=tf.reshape(x,[10*1000*3,4]) 
y=tf.transpose(y,perm=[1,0]) #[4,1000] 
result=tf.matmul(x,y) 
result=tf.reshape(result,[10,1000,3,1000]) 

結果は形状[10,1000,3,1000]であり、[10,1000,3]ではありません。
冗長性を取り除く方法がわかりません1000
ブロードキャストをサポートするtf.matmulと同じ結果を得るにはどうすればよいですか?

答えて

1

私はそれを自分で解決します。

x=tf.transpose(x,perm=[1,0,2,3]) #[1000,10,3,4] 
x=tf.reshape(x,[1000,30,4]) 
y=tf.reshape(y,[1000,4,1]) 
result=tf.matmul(x,y) #[1000,30,1] 
result=tf.reshape(result,[1000,10,3]) 
result=tf.transpose(result,perm=[1,0,2]) #[10,1000,3] 
関連する問題