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