pytorch中的乘法操作

pytorch中提供了多种函数用于乘法操作,不同函数,功能有什么不一样呢?

torch.mul

multiply是mul的别名,与mul用法一致

torch.mul(input, other, *, out=None)

主要由两种用法:

(1)一个数和tensor中的每个元素对应相乘

a = torch.Tensor([[1, 2], [3, 4], [5, 6]])
b = torch.mul(a, 2)
print(b)
tensor([[ 2.,  4.],
        [ 6.,  8.],
        [10., 12.]])

(2)tensor与tensor中的每个元素相乘

a = torch.Tensor([[1, 2], [3, 4], [5, 6]])
c = torch.mul(a, a)
print(c)
tensor([[ 1.,  4.],
        [ 9., 16.],
        [25., 36.]])

令我疑惑的是,官方代码中给出了下图的一个例子,自己运行了确实得到相同的结果。但是如果将两个维度改成4*2和2*4,代码报错。不知道为什么会这么设计?
torch.mul官方例子

torch.mm

torch.mm(input, mat2, *, out=None)

实现了矩阵相乘(只能处理二维tensor)

a = torch.Tensor([[1, 2], [3, 4], [5, 6]])
b = a.t()
c = torch.mm(a, b)
print(c)
tensor([[ 5., 11., 17.],
        [11., 25., 39.],
        [17., 39., 61.]])

torch.bmm

torch.bmm(input, mat2, *, deterministic=False, out=None)

实现了三维tensor的相乘,并且两个tensor的第一个维度要一致,在神经网络里面一般对应这batch这一维度。即按照第一个维度切分成多个矩阵,然后再进行矩阵相乘。

a = torch.randn(10, 3, 4)
b = torch.randn(10, 4, 5)
c = torch.bmm(a, b).size()
print(c)
torch.Size([10, 3, 5])

torch.matmul

torch.matmul(input, other, *, out=None)

根据输入维度的不同,torch.matmul实现了多种乘法

(1)输入两个向量,两个向量同维度,则计算这两个向量的‘内积

a = torch.tensor([1, 2, 3])
b = torch.tensor([1, 2, 3])
c = torch.matmul(a, b)
print(c)
tensor(14)

(2)输入一个矩阵和一个向量,向量的维度等于矩阵维度的其中一维,隐式的将向量的第二个维度扩展为1,然后进行矩阵乘法操作,并还原维度

a = torch.Tensor([[1, 2], [3, 4], [5, 6]])
b = torch.Tensor([1, 2])
c = torch.matmul(a, b)
# (3*2)x(2*1)
print(c)
tensor([ 5., 11., 17.])

(3)输入的为两个矩阵,并且可以进行乘法操作,则进行矩阵相乘,与此处torch.mm功能一致

a = torch.Tensor([[1, 2], [3, 4], [5, 6]])
b = a.t()
c = torch.matmul(a, b)
print(c)
tensor([[ 5., 11., 17.],
        [11., 25., 39.],
        [17., 39., 61.]])

(4)输入一个是三维tensor,一个是向量。隐式的将向量扩展成三维,第一维与另一个tensor相同,第二维是原来向量的维度,第三维为1,然后进行tensor的相乘操作,并还原维度

a = torch.randn(10, 3, 4)
b = torch.randn(4)
c = torch.matmul(a, b).size()
# (10*3*4)*(10*4*1)
print(c)
torch.Size([10, 3])

(5)输入一个三维tensor和一个矩阵,矩阵进行复制扩展,进行tensor相乘操作,并还原维度

a = torch.randn(10, 3, 4)
b = torch.randn(4, 5)
c = torch.matmul(a, b).size()
# (10*3*4)*(10*4*5)
print(c)
torch.Size([10, 3, 5])

(6)输入是两个三维tensor,进行tensor相乘操作,这里与torch.bmm的功能一致

a = torch.randn(10, 3, 4)
b = torch.randn(10, 4, 5)
c = torch.matmul(a, b).size()
print(c)
torch.Size([10, 3, 5])

torch.matmul会对输入进行必要维度的扩展(broadcast)

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

旺旺棒棒冰

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值