2017-09-14 4 views
2

したがって、形状[32,60,60]の配列Aと形状[32,60]の配列Bがあります。最初の次元はバッチサイズなので、最初の次元は独立しています。私がしたいのは、ベクトル乗算による単純な行列です。したがって、Aの各サンプルでは、​​[60,60]という形状の行列に形状のベクトル[60]を乗算したいと考えています。 A * Bのバッチを掛け合わせると、形状が[32,60]の配列になるはずです。テンソルを行列で掛けるにはどうすればいいですか

これは単純でなければなりませんが、私は何か間違ったことをやっている:

>>> v = np.matmul(A,B) 
ValueError: shapes (32,60,60) and (32,60) not aligned: 60 (dim 2) != 32 (dim 0) 

これはtensorflowのためですが、私は表記を変換することができればnumpyの答えは十分です。

答えて

2

matrix-multiplicationの2つの入力配列の最後の軸をsum-reduceにしようとしているようです。我々はtf.einsumを使用することができ、tensorflowについては

np.einsum('ijk,ik->ij',A,B) 

- だから、np.einsumと、それは次のようになります。 np.matmul


、我々は最後のもので、新しい軸を導入することにより、3DBを拡張する必要があります。したがって、np.matmulを使用すると、B's拡張バージョンsum-reducedの2番目の軸がAの3番目の軸に対して取得されます。結果は3Dになります。ですから、最後のシングルトン軸をスライスで詰めるか、np.squeezeにしてください。したがって、実装は、tf.matmulの機能を既に持っています。 -

np.matmul(A,B[...,None])[...,0] 

+0

tf.einsumは魅力的に機能します。私はeinsumを知らなかった。ありがとう! – vega

関連する問題