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

Day24_【深度学习—广播机制】 - 详解

Day24_【深度学习—广播机制】 - 详解

广播机制用于判断两个不同形状的张量是否可以进行逐元素运算(如 +, -, * 等)。它的规则是从最后一个维度开始,从右往左逐一比较两个张量的维度大小。

只要每一个维度都满足以下三条规则中的任意一条,广播就可以成功。


规则 1:维度大小相等

解释:两个张量在当前比较的这个维度上,它们的“长度”或“大小”是一样的。

例子

a = torch.tensor([[1, 2, 3],    # 形状: (2, 3)
[4, 5, 6]])
b = torch.tensor([[7, 8, 9],    # 形状: (2, 3)
[10,11,12]])

我们从右往左比较:

  • 第1维(列)a 是 3b 也是 3 → ✅ 相等,兼容
  • 第0维(行)a 是 2b 也是 2 → ✅ 相等,兼容

✅ 所有维度都相等 → 可以直接运算,无需广播。


规则 2:其中一个维度的大小为 1

解释:在当前比较的维度上,只要有一个张量的大小是 1,它就可以被“复制”多次,扩展到和另一个张量一样长。

例子

a = torch.tensor([[1, 2, 3],    # 形状: (2, 3)
[4, 5, 6]])
b = torch.tensor([1, 1, 1])     # 形状: (3,)

从右往左比较:

  • 第1维(列)a3b3 → ✅ 相等,兼容

  • 第0维(行)a2b 是?
    注意:b 只有一个维度,所以它没有第0维(见规则3),但我们先看这个维度的大小。

    实际上,在广播中,b 被视为形状 (1, 3)(前面补一个1),所以:

    • a 第0维:2
    • b 第0维:1 → ✅ 有一个是 1,兼容

✅ 所有维度都兼容 → 可以广播!

广播过程b = [1, 1, 1] 被自动扩展成:

[[1, 1, 1],
[1, 1, 1]]

然后与 a 逐元素相加。

c = a + b
# 结果:
# [[2, 3, 4],
#  [5, 6, 7]]

规则 3:其中一个张量在该维度上不存在(即维度数更少)

解释:两个张量的总维度数不同,比如一个是 2D 矩阵,一个是 1D 向量。那么在比较时,维度数少的那个张量,前面缺失的维度被视为大小为 1

这是广播中最容易混淆的一条,我们重点解释。

例子

a = torch.tensor([[[1, 2],      # 形状: (2, 2, 2)
[3, 4]],
[[5, 6],
[7, 8]]])
b = torch.tensor([10, 20])      # 形状: (2,)
  • a 是 3D 张量:形状 (2, 2, 2)
  • b 是 1D 向量:形状 (2,)

从右往左比较:

维度位置a 的大小b 的大小是否兼容说明
第2维(最右)22✅ 相等规则1
第1维2??b 没有第1维 → 视为 1 ✅
第0维2??b 没有第0维 → 视为 1 ✅

所以 b 在广播中被视为形状 (1, 1, 2)

然后它被扩展为 (2, 2, 2)

[[[10, 20],
[10, 20]],
[[10, 20],
[10, 20]]]

然后与 a 相加。


广播的“从右往左”原则(非常重要!)

广播总是从最后一个维度开始比较,而不是从第一个。

例子

a = torch.randn(3, 1)   # 形状: (3, 1)
b = torch.randn(   2)   # 形状: (2,)

比较:

  • 第1维(列):a 是 1b 是 2 → 一个为 1 ✅(规则2)
  • 第0维(行):a 是 3b 没有 → 视为 1 ✅(规则3)

✅ 可广播!结果形状 (3, 2)

但如果:

a = torch.randn(1, 3)   # (1, 3)
b = torch.randn(2,   )   # (2,)
  • 第1维:3 vs 2 → 不相等,且都不为 1 → ❌ 不兼容!广播失败!

✅ 总结:三条规则的通俗理解

规则通俗说法例子
1. 大小相等“你们长度一样,可以直接比”(3,) 和 (3,)
2. 有一个是 1“你只有1个,我可以复制你”(2, 1) 和 (2, 5)
3. 一个不存在“你维度少,我把你前面补1”(2, 3) 和 (3,) → (3,) 视为 (1, 3)
http://www.hskmm.com/?act=detail&tid=12529

相关文章:

  • IAR Embedded Workbench中的MCU启动过程分析
  • CSP-S 2025
  • 别样的CSP-S初赛大战(又名:我和油一的那些年)
  • 在ubuntu系统的c语言程序
  • springboot2整合dynamic-datasource-spring-boot-starter多数据源
  • 赛前训练2 extra 思维与构造
  • 详细介绍:基于java的奶茶店管理系统的设计与实现37038-计算机毕设原创(免费领源码+部署教程)
  • 详细介绍:算法题(203):矩阵最小路径和
  • 使用jdbcTemplate查询数据库
  • 线性结构之链表预备知识typedef[基于郝斌课程]
  • Excel滚动表格表头不见了,来回翻动很麻烦,Excel如何固定显示表头?
  • asfp导入framework搭建环境
  • 赛前训练2 连通性问题
  • 用 【C# + WinUI3 + 图像动画】 来理解:高数 - 函数 - 初等函数 - 行人-
  • ansible语句
  • Window 连接 Ubuntu远程桌面
  • 代码随想录算法训练营第四天 |24. 两两交换链表中的节点、19.删除链表的倒数第N个节点、面试题 02.07. 链表相交、142.环形链表II
  • 浅谈根号分治
  • 提高杂题
  • 【比赛记录】2025CSP-S模拟赛51
  • 完整教程:【前端面试题✨】Vue篇(一)
  • gdu 手机清理 空间占用
  • Android 源码解析 之 MediaPlayer
  • 5. 二叉树
  • 第二周预习作业
  • Revit二次开发环境配置
  • CF1016G Appropriate Team
  • CF494C Helping People
  • 深入解析:Extract Chart Data Directly to Excel
  • AOSP Android12 Source 下载同步