我对使用 * 和 matmul 的两个张量之间的乘法感到困惑。 下面是我的代码
import torch
torch.manual_seed(7)
features = torch.randn((2, 5))
weights = torch.randn_like(features)
在这里,我想将权重和特征相乘。所以,一种方法如下
print(torch.sum(features * weights))
输出:
tensor(-2.6123)
另一种方法是使用 matmul
print(torch.mm(features,weights.view((5,2))))
但是,这里的输出是
tensor([[ 2.8089, 4.6439],
[-2.3988, -1.9238]])
我在这里不明白的是,为什么
matmul
和通常的乘法在两者相同时给出不同的输出。我在这里做错了什么吗?
编辑:当我使用形状
(1,5)
的特征时,*和matmul
输出是相同的。
但是,当形状是(2,5)
时,它就不一样了。
当您使用
*
时,乘法是元素乘法,当您使用torch.mm
时,它是矩阵乘法。
示例:
a = torch.rand(2,5)
b = torch.rand(2,5)
result = a*b
result
的形状与 a
或 b
相同,即 (2,5)
在考虑操作时
result = torch.mm(a,b)
它将给出大小不匹配错误,因为这是正确的矩阵乘法(正如我们在线性代数中研究的那样)和
a.shape[1] != b.shape[0]
。当您在 torch.mm
中应用视图操作时,您正在尝试匹配尺寸。
在某些特定维度的形状为 1 的特殊情况下,它变成点积,因此
sum (a*b)
与 mm(a, b.view(5,1))
相同
在 PyTorch 中,matmul() 或
@
可以执行 点乘法、矩阵向量乘法 和 矩阵乘法,这与由 mul( 完成的称为 逐元素乘法 的通常乘法不同) ) 或 *
。
我对 PyTorch 函数和运算符进行了分类,如下所示:
dot() 可以乘以一维张量。
matmul()
或 @
可以乘以 1D 或更多 D 张量。
mv() 可以将 2D 和 1D 张量相乘。
matmul()
或 @
可以乘以 1D 或更多 D 张量。