首页 > 解决方案 > matmul和张量的通常乘法之间有什么区别吗

问题描述

我对使用 * 和 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)

标签: pythonnumpypytorchtensor

解决方案


使用*时,乘法是元素乘法,使用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))


推荐阅读