张量的乘积与通常的乘积之间有什么区别

时间:2018-11-08 06:21:19

标签: python numpy pytorch tensor

我对使用*和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)时,情况会有所不同。

1 个答案:

答案 0 :(得分:5)

使用*时,乘法是按元素进行的;使用torch.mm时,乘法是矩阵的乘法。

示例:

a = torch.rand(2,5)
b = torch.rand(2,5)
result = a*b 

result的形状将与ab相同,即(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))相同