当前位置: 首页 > article >正文

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

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

      • 代码
      • 代码 1:`torch.matmul(x, y)`
        • 输入张量:
        • 计算逻辑:
        • 输出结果:
      • 代码 2:`y = y.view(4,1)` 再 `torch.matmul(x, y)`
        • 输入张量:
        • 计算逻辑:
        • 输出结果:
      • 总结:两种情况的区别


代码

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)
>>>
tensor([11, 35])
tensor([11, 35])
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)
>>>
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 x[i, j] \cdot y[j] result[i]=jx[i,j]y[j]

具体计算步骤:

  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 (12)+(23)+(31)+(40)=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 (52)+(63)+(71)+(80)=10+18+7+0=35
输出结果:
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 x[i, j] \cdot y[j, k] result[i,k]=jx[i,j]y[j,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 (12)+(23)+(31)+(40)=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 (52)+(63)+(71)+(80)=10+18+7+0=35
输出结果:
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)
    • 矩阵乘法严格遵守二维矩阵的维度规则。

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

原文地址:https://blog.csdn.net/xzs1210652636/article/details/145085866
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.kler.cn/a/504237.html

相关文章:

  • ubuntu k8s 1.31
  • Redis 持久化机制:RDB 和 AOF
  • ngrok同时配置多个内网穿透方法
  • 【时时三省】(C语言基础)文件的顺序读写
  • ES6 简单练习笔记--变量申明
  • 数据结构与算法之递归: LeetCode 131. 分割回文串 (Ts 版)
  • 【reactjs进阶】react状态管理之mobx6.x的使用的使用(一)
  • Rust 游戏开发框架指南
  • pytorch小记(三):pytorch中的最大值操作:x.max()
  • Linux的基础IO内容补充-FILE
  • pycharm 安装三方插件后,导致pycharm无法启动的解决方式
  • LeetCode2799 统计完全子数组的数目
  • 播放音频文件同步音频文本
  • [mysql]日志
  • vscode 扩展Cline、Continue的差别?
  • fpga 的时钟管理模块pll 跟 dcm
  • J.U.C(2)
  • JSON简介与使用
  • golang 环境变量配置
  • CSS语言的计算机基础
  • 在 Azure 100 学生订阅中新建 Ubuntu VPS 并通过 Docker 部署 Mastodon 服务器
  • C#委托(Delegate)基本用法
  • GD32F470Z外部晶振不起振
  • 【Hive】新增字段(column)后,旧分区无法更新数据问题
  • 1.13 多线程编程
  • 社群团购项目运营策略的深度剖析:融合链动2+1模式、AI智能名片与S2B2C商城小程序的综合应用