我试图在两个Tensor的列之间执行点积。我试图以最有效的方式做到这一点。然而,我的两种方法并不匹配。
我使用torch.sum(torch.mul(a, b), axis=0)
的第一个方法给了我预期的结果,torch.einsum('ji, ji -> i', a, b)
(取自Efficient method to compute the row-wise dot product of two square matrices of the same size in PyTorch)没有。可重复的代码如下:
import torch
device = torch.device('cuda' if torch.cuda.is_available() else 'cpu')
torch.manual_seed(0)
a = torch.randn(3,1, dtype=torch.float).to(device)
b = torch.randn(3,4, dtype=torch.float).to(device)
print(f"a : \n{a}\n")
print(f"b : \n{b}\n")
print(f"Expected: {a[0,0]*b[0,0] + a[1,0]*b[1,0] + a[2,0]*b[2,0]}")
c = torch.sum(torch.mul(a, b), axis=0)
print(f"sum and mul: {c[0].item()}")
d = torch.einsum('ji, ji -> i', a, b)
print(f"einsum: {d[0].item()}\n")
print(torch.eq(c,d))
输出为:
注意:在CPU上(我所做的只是删除.to(device)
),最后一行torch.eq(c,d)
都是真的,但是,我需要Tensor在GPU上。
此外,对于一些种子,如torch.manual_seed(100)
,Tensor相等…
我觉得它必须是与einsum
的东西,因为我可以得到我的预期答案与其他方式。
1条答案
按热度按时间blmhpbnm1#
正如@Hayoung所强调的,这是由于操作计算中的数值错误。即使使用 double 作为数据类型,您也会得到不同的结果。您可以使用
torch.isclose
来比较Tensor值。