pytorch中torch.mul、torch.mm/torch.bmm、torch.matmul的区别

这篇博客详细介绍了PyTorch中矩阵乘法的三种不同操作:torch.mul、torch.mm和torch.matmul。torch.mul用于按元素相乘,如果是两个张量则遵循广播规则,若是标量则与张量逐元素相乘。torch.mm专门针对二维矩阵的外积,而torch.matmul更为通用,可以处理任意维度且符合广播规则的张量矩阵乘法。文中通过代码示例展示了各种乘法的使用和结果差异。

预备知识:矩阵的各种乘积

三者对比

torch.mul: 两个输入按元素相乘,内积

分两种情况,默认其中一个是tensor

  1. 另一个也是tensor,那么两者就要符合broadcasedt的规则
  2. 另一个是标量,那就用标量的数值乘对应tensor就好

torch.mm: 特指二维矩阵乘法,外积

If input is (n×m) tensor, mat2 is a (m×p) tensor, out will be a (n×p) tensor.

bonus: torch.bmm就是加了一维batch_size, 也是一样的,只能说3维的两个向量,而且必须符合boardcasted规则


torch.matmul: 两个tensor的矩阵乘积,与mm的区别就是不限制是不是二维,符合broadcasted规则的都可以

例如
if input is a (j×1×n×n) tensor and other is a(k×n×n) tensor, out will be a (j×k×n×n) tensor.

代码演示

import torch


num=10
mat1=torch.randn(2,3)
mat2=torch.randn(3,3)
mat3=torch.randn(3,2,3)
#
print("torch.mul的结果1\n",torch.mul(mat1,num))
print("torch.mul的结果2\n",torch.mul(mat1,mat1))
print("torch.mm的结果[二维矩阵相乘]\n",torch.mm(mat1,mat2))
print("torch.matmul的结果[二维矩阵相乘]\n",torch.matmul(mat3,mat2))

'''
torch.mul的结果1
 tensor([[ 3.9774,  8.8436, -0.6948],
        [20.7512,  6.7674,  8.6104]])
torch.mul的结果2
 tensor([[0.1582, 0.7821, 0.0048],
        [4.3061, 0.4580, 0.7414]])
torch.mm的结果[二维矩阵相乘]
 tensor([[-0.4850, -1.0539, -0.9389],
        [-0.4043, -3.4724,  0.1518]])
torch.matmul的结果[二维矩阵相乘]
 tensor([[[-1.8273, -2.6934, -0.2099],
         [-0.7700,  0.9479,  2.2710]],

        [[-0.4027,  1.9117,  0.0667],
         [ 1.1908,  1.0069, -2.3486]],

        [[-1.1636,  0.1499,  3.8286],
         [ 1.0558, -1.7520,  0.8731]]])
         '''

注意:
*,@是两个运算符,他们分别映射到函数torch.mul和torch.matmul()

### PyTorch 中张量矩阵乘法的用法及维度匹配规则 在 PyTorch 中,矩阵乘法可以通过 `torch.mm` 和 `torch.matmul` 来实现。对于批量矩阵乘法,则可以使用 `torch.bmm` 或者更通用的 `torch.matmul` 函数。 #### 基本矩阵乘法规则 当执行标准矩阵乘法时,假设有一个形状为 `(m, n)` 的矩阵 A 和一个形状为 `(n, p)` 的矩阵 B,那么它们相乘的结果 C 将是一个形状为 `(m, p)` 的矩阵[^1]: ```python import torch tensor1 = torch.randn(3, 4) # 形状为 (3, 4) tensor2 = torch.randn(4, 5) # 形状为 (4, 5) result = torch.mm(tensor1, tensor2) # 结果形状应为 (3, 5) print(result.shape) ``` #### 批量矩阵乘法规则 如果要处理多个矩阵的同时乘法(即批量矩阵),比如有两组大小相同的矩阵集合 X 和 Y,每组都包含 b 个矩阵,其中每个矩阵分别为 m×n 和 n×p 大小,那么最终得到的是由 b 个 m×p 矩阵组成的输出 Z: ```python batch_tensor1 = torch.randn(2, 3, 4) # 形状为 (2, 3, 4),表示有两个 3x4 的矩阵 batch_tensor2 = torch.randn(2, 4, 5) # 形状为 (2, 4, 5),表示有两个 4x5 的矩阵 batch_result = torch.bmm(batch_tensor1, batch_tensor2) # 输出形状应为 (2, 3, 5) print(batch_result.shape) ``` #### 维度广播机制下的矩阵乘法 除了上述两种情况外,在某些情况下即使输入张量不完全满足严格的尺寸要求也可以通过自动扩展来进行运算。例如,当其中一个操作数是二维而另一个是一维时,一维的操作数会被视为具有额外的一批或列/行来适应另一方;或者当两个三维张量的最后一维和倒数第二维分别相同的时候也能正常工作。 ```python matrix = torch.randn(3, 4) # 形状为 (3, 4) vector = torch.randn(4) # 形状为 (4,) broadcasted_mul = matrix @ vector # 这里会把 vector 当作 (4, 1) 来对待,结果形状为 (3,) print(broadcasted_mul.shape) ``` 需要注意的是,为了使这些函数能够成功运行而不抛出错误,参与运算的对象之间的相应轴长度必须严格一致或者是其中之一等于1以便于广播。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值