2017-09-14 165 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

看來你正在試圖sum-reduce來自兩個輸入數組的最後一個軸,那個matrix-multiplication。所以,用np.einsum,這將是 -

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

對於tensorflow,我們可以使用tf.einsum


隨着np.matmul,我們需要在最後一個引入新中軸線延伸至B3D。因此,使用np.matmul將獲得B's擴展版本sum-reduced的第二軸對照A中的第三個。結果將是3D。所以,得到最後的單軸擠壓切片或np.squeeze。因此,實現起來 -

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

我們已經有一個現成tf.matmul功能存在。

+0

tf.einsum就像一個魅力。我沒有意識到這個消息。謝謝! – vega