首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用tensordot实现批量矩阵乘法

使用tensordot实现批量矩阵乘法
EN

Stack Overflow用户
提问于 2017-09-19 01:34:17
回答 1查看 1.7K关注 0票数 2

我正在尝试实现与np.matmul并行矩阵乘法相同的行为,只使用伸缩点、点和重塑等。

我要使用的库没有支持并行乘法的matmul,只有点和tensordot。

此外,我希望避免在第一维上迭代,并希望使用一组矩阵乘法和重塑(希望使用BLAS/GPU运行,因为我有大量的小矩阵要并行计算)。

下面是一个示例:

代码语言:javascript
复制
import numpy as np

angles = np.array([np.pi/4, 2*np.pi/4, 2*np.pi/4])

vectors = np.array([ [1,0],[1,-1],[-1,0]])

s = np.sin(angles)
c = np.cos(angles)

rotations = np.array([[c,s],[-s,c]]).T

print rotations

print vectors

print("Correct: %s" % np.matmul(rotations, vectors.reshape(3,2,1)))

# I want to do this using tensordot/reshaping, i.e just gemm BLAS operations underneath
print("Wrong: %s" % np.tensordot(rotations, vectors, axes=(1,1)))

此命令的输出为:

代码语言:javascript
复制
Correct: [[[  7.07106781e-01]
  [  7.07106781e-01]]

 [[  1.00000000e+00]
  [  1.00000000e+00]]

 [[ -6.12323400e-17]
  [ -1.00000000e+00]]]


Wrong: [[[  7.07106781e-01   1.11022302e-16  -7.07106781e-01]
  [ -7.07106781e-01  -1.41421356e+00   7.07106781e-01]]

 [[  6.12323400e-17  -1.00000000e+00  -6.12323400e-17]
  [ -1.00000000e+00  -1.00000000e+00   1.00000000e+00]]

 [[  6.12323400e-17  -1.00000000e+00  -6.12323400e-17]
  [ -1.00000000e+00  -1.00000000e+00   1.00000000e+00]]]

有没有一种方法可以修改第二个表达式,以获得与第一个表达式相同的结果,只需使用点/张点。

我相信这是可能的,并且见过some comments online,但从未见过任何示例

EN

回答 1

Stack Overflow用户

发布于 2017-09-19 01:37:56

我们需要保持一个对齐,并将其也保持在输出中。所以,tensordot/dot不会在这里工作。More info on tensordot可能会以某种方式解释为什么它不会,但是,我们可以使用np.einsum,在大多数情况下(以我的经验),它被认为比np.matmul略快。

它的实现看起来像这样-

代码语言:javascript
复制
np.einsum('ijk,ik->ij',rotations, vectors)

而且,似乎期望的输出有一个尾随的单例dim。因此,使用None/np.newaxis添加一个新的轴,如下所示-

代码语言:javascript
复制
np.einsum('ijk,ik->ij',rotations, vectors)[...,None]
票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/46285163

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档