pytorch小记(一):pytorch矩阵乘法:torch.matmul(x, y)

pytorch小记(一):pytorch矩阵乘法:torch.matmul(x, y)/ x @ y


代码

python 复制代码
x = torch.tensor([[1,2,3,4], [5,6,7,8]])
y = torch.tensor([2, 3, 1, 0]) # y.shape == (4)
print(torch.matmul(x, y))
print(x @ y)
python 复制代码
>>>
tensor([11, 35])
tensor([11, 35])
python 复制代码
x = torch.tensor([[1,2,3,4], [5,6,7,8]])
y = torch.tensor([2, 3, 1, 0]) # y.shape == (4)
y = y.view(4,1)                # y.shape == (4, 1)
'''
tensor([[2],
        [3],
        [1],
        [0]])
'''
print(torch.matmul(x, y))
print(x @ y)
python 复制代码
>>>
tensor([[11],
        [35]])
tensor([[11],
        [35]])

在这段代码中,torch.matmul(x, y) 或者x @ y计算的是矩阵乘法或张量乘法。我们分两种情况详细分析:


代码 1:torch.matmul(x, y)

输入张量:
  • x 是一个 2D 张量,形状为 (2, 4):

    复制代码
    tensor([[1, 2, 3, 4],
            [5, 6, 7, 8]])
  • y 是一个 1D 张量,形状为 (4,):

    复制代码
    tensor([2, 3, 1, 0])
计算逻辑:

在 PyTorch 中,如果 matmul 的一个输入是 2D 张量,另一个是 1D 张量,计算规则是:

  • 将 1D 张量 y 当作列向量 (4, 1),与矩阵 x 进行矩阵乘法。
  • 结果是一个 1D 张量,形状为 (2,)。

矩阵乘法公式:
result i = ∑ j x i , j ⋅ y j \text{result}i = \sum_j xi, j \cdot yj resulti=j∑xi,j⋅yj

具体计算步骤:

  1. 对第一行 [1, 2, 3, 4]:
    ( 1 ⋅ 2 ) + ( 2 ⋅ 3 ) + ( 3 ⋅ 1 ) + ( 4 ⋅ 0 ) = 2 + 6 + 3 + 0 = 11 (1 \cdot 2) + (2 \cdot 3) + (3 \cdot 1) + (4 \cdot 0) = 2 + 6 + 3 + 0 = 11 (1⋅2)+(2⋅3)+(3⋅1)+(4⋅0)=2+6+3+0=11
  2. 对第二行 [5, 6, 7, 8]:
    ( 5 ⋅ 2 ) + ( 6 ⋅ 3 ) + ( 7 ⋅ 1 ) + ( 8 ⋅ 0 ) = 10 + 18 + 7 + 0 = 35 (5 \cdot 2) + (6 \cdot 3) + (7 \cdot 1) + (8 \cdot 0) = 10 + 18 + 7 + 0 = 35 (5⋅2)+(6⋅3)+(7⋅1)+(8⋅0)=10+18+7+0=35
输出结果:
python 复制代码
torch.matmul(x, y)
# tensor([11, 35])

代码 2:y = y.view(4,1) 再 torch.matmul(x, y)

输入张量:
  • x 是同一个 2D 张量,形状为 (2, 4)。

  • y 被重塑为 2D 张量,形状为 (4, 1):

    复制代码
    tensor([[2],
            [3],
            [1],
            [0]])
计算逻辑:

在这种情况下,matmul 执行的是 矩阵乘法 ,两个输入的形状为 (2, 4) 和 (4, 1):

  • 矩阵乘法的规则是:前一个矩阵的列数必须等于后一个矩阵的行数。
  • 结果张量的形状是 (2, 1)。

矩阵乘法公式:
result i , k = ∑ j x i , j ⋅ y j , k \text{result}i, k = \sum_j xi, j \cdot yj, k resulti,k=j∑xi,j⋅yj,k

具体计算步骤:

  1. 对第一行 [1, 2, 3, 4] 和列向量 [[2], [3], [1], [0]]:
    ( 1 ⋅ 2 ) + ( 2 ⋅ 3 ) + ( 3 ⋅ 1 ) + ( 4 ⋅ 0 ) = 2 + 6 + 3 + 0 = 11 (1 \cdot 2) + (2 \cdot 3) + (3 \cdot 1) + (4 \cdot 0) = 2 + 6 + 3 + 0 = 11 (1⋅2)+(2⋅3)+(3⋅1)+(4⋅0)=2+6+3+0=11
  2. 对第二行 [5, 6, 7, 8] 和列向量 [[2], [3], [1], [0]]:
    ( 5 ⋅ 2 ) + ( 6 ⋅ 3 ) + ( 7 ⋅ 1 ) + ( 8 ⋅ 0 ) = 10 + 18 + 7 + 0 = 35 (5 \cdot 2) + (6 \cdot 3) + (7 \cdot 1) + (8 \cdot 0) = 10 + 18 + 7 + 0 = 35 (5⋅2)+(6⋅3)+(7⋅1)+(8⋅0)=10+18+7+0=35
输出结果:
python 复制代码
torch.matmul(x, y)
# tensor([[11],
#         [35]])

总结:两种情况的区别

  1. y 是 1D 张量:

    • torch.matmul(x, y) 返回一个 1D 张量 ,形状为 (2,)。
    • 相当于将 y 当作列向量,与矩阵 x 做矩阵乘法。
  2. y 是 2D 张量:

    • torch.matmul(x, y) 返回一个 2D 张量 ,形状为 (2, 1)。
    • 矩阵乘法严格遵守二维矩阵的维度规则。

两者的结果数值相同,但形状不同,主要是因为输入张量的维度不同,导致输出的维度也发生了变化。

相关推荐
智感子4 小时前
测控链路:从传感器到上位机
人工智能·嵌入式硬件·fpga开发
人工智能技术咨询.8 小时前
具身智能中的世界模型训练
人工智能
LaughingZhu8 小时前
Product Hunt 每日热榜 | 2026-10-06
人工智能·深度学习·神经网络·搜索引擎·百度
AOI小白新手上路8 小时前
AOI 缺陷检测复现实操指南:Anomalib + MVTec AD(glass)与 YOLOv8 + NEU-DET 两条路线
人工智能·深度学习·yolo
henrylin99998 小时前
RD-AGENT 第一讲 · AI 因子工厂是怎么运转的
人工智能
高洁019 小时前
具身智能中的世界模型训练
人工智能·python·深度学习·机器学习·transformer
无线通信科研笔记9 小时前
IEEE TVT 2026 论文精读与完整复现|相位误差如何重塑近场 RIS 的幅相响应
论文阅读·人工智能·python·算法·论文笔记
Devlive 开源社区9 小时前
AuthX 正式更名 GrantForge:我们重新做了一遍权限管理系统
大数据·人工智能·架构
朝朝辞暮i9 小时前
VLA 系统学习第 1 课:VLA 到底在干什么?
人工智能·python·计算机视觉·vla
鲲穹AI种草9 小时前
AI 壁纸生成工具怎么选?鲲穹 AI 壁纸工具功能实测与横向对比
人工智能·壁纸生成工具