matmul 和通常的张量乘法有什么区别吗

问题描述 投票:0回答:2

我对使用 * 和 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)
时,它就不一样了。

python numpy pytorch tensor
2个回答
12
投票

当您使用

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

相同

0
投票

在 PyTorch 中,matmul()

@
可以执行 点乘法矩阵向量乘法矩阵乘法,这与由 mul( 完成的称为 逐元素乘法 的通常乘法不同) )
*

我对 PyTorch 函数和运算符进行了分类,如下所示:

<点乘法>

  • dot() 可以乘以一维张量。

  • matmul()
    @
    可以乘以 1D 或更多 D 张量。

<矩阵向量乘法>

  • mv() 可以将 2D 和 1D 张量相乘。

  • matmul()
    @
    可以乘以 1D 或更多 D 张量。

<矩阵乘法>

  • mm() 可以乘以 2D 张量。

  • bmm() 可以乘以 3D 张量。

  • matmul()
    @
    可以乘以 1D 或更多 D 张量。

<逐元素计算>

  • mul()
    *
    可以与 0D 或更多 D 张量进行乘法:

  • div()

    /
    可以用 0D 或更多 D 张量进行除法

  • remainder()

    %
    可以用0D或更多D张量进行模(mod)计算。

  • add()

    +
    可以对 0D 或更多 D 张量进行加法。

  • sub()

    -
    可以与 0D 或更多 D 张量进行减法。

最新问题
© www.soinside.com 2019 - 2025. All rights reserved.