Pytorch - 移植@操作员

raa*_*aaj 3 pytorch

我有以下代码行我想移植到 Torch Matmul

rotMat = xmat @ ymat @ zmat
Run Code Online (Sandbox Code Playgroud)

我能知道这是否是正确的顺序:

rotMat = torch.matmul(xmat, torch.matmul(ymat, zmat))
Run Code Online (Sandbox Code Playgroud)

jod*_*dag 5

根据关于运算符优先级的python docs,运算@符具有从左到右的结合性

https://docs.python.org/3/reference/expressions.html#operator-precedence

同一个盒子中的运算符从左到右分组(幂运算除外,从右到左分组)。

因此等价的操作是

rotMat = torch.matmul(torch.matmul(xmat, ymat), zmat)
Run Code Online (Sandbox Code Playgroud)

但请记住,矩阵乘法是关联的(数学上),因此如果您以另一种方式进行,则结果不会有太大差异。通常,您希望以最少计算步骤的方式进行关联。例如使用朴素矩阵乘法算法,如果 X 是 1x10,Y 是 10x100,Z 是 100x1000 那么

(X @ Y) @ Z
Run Code Online (Sandbox Code Playgroud)

X @ (Y @ Z)
Run Code Online (Sandbox Code Playgroud)

第一次大约是 1*10*100 + 1*100*1000 = 101,000 次乘法/加法运算,而第二次则是 10*100*1000 + 1*10*1000 = 1,001,000 次运算。尽管它们具有相同的结果(忽略舍入误差),但第二个版本会慢 10 倍左右!


正如@Szymon Maszke 所指出的,pytorch 张量也支持@运算符,因此您仍然可以使用

xmat @ ymat @ zmat
Run Code Online (Sandbox Code Playgroud)

在 pytorch 中。