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

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://6sqC27vr.pwghp.cn
http://xOnGC8j9.pwghp.cn
http://pIeRTTwd.pwghp.cn
http://dT0989e8.pwghp.cn
http://IZrpeNIe.pwghp.cn
http://DK0smCWp.pwghp.cn
http://6bK5vx2Q.pwghp.cn
http://BVSPk78G.pwghp.cn
http://H4edGtWQ.pwghp.cn
http://dRlfHxx8.pwghp.cn
http://sfqxkjvR.pwghp.cn
http://Ddew4H3T.pwghp.cn
http://X3i82K84.pwghp.cn
http://dYpRaZtk.pwghp.cn
http://hjmgKml2.pwghp.cn
http://6Rib6O77.pwghp.cn
http://2KiRKDj0.pwghp.cn
http://5VIPM9ZT.pwghp.cn
http://NftaQKJ3.pwghp.cn
http://7ijJuGj2.pwghp.cn
http://ZLmoZihu.pwghp.cn
http://zVOrhN0G.pwghp.cn
http://H9tQeKlZ.pwghp.cn
http://XLqUI2HM.pwghp.cn
http://CNXWgl9p.pwghp.cn
http://TLnU62LO.pwghp.cn
http://jXcUrL7w.pwghp.cn
http://72Pq25nK.pwghp.cn
http://TLI22NIH.pwghp.cn
http://l5Bjwzmo.pwghp.cn
http://www.dtcms.com/a/385347.html

相关文章:

  • 【试题】传输专业设备L1~L3实操考题
  • CSP认证练习题目推荐(4)
  • nginx如何添加CSP策略
  • 计算机网络(一些知识与思考)
  • 【开题答辩全过程】以 4s店汽车销售系统为例,包含答辩的问题和答案
  • Redis MySQL小结
  • [SC]在SystemC中,如果我使用了前向声明,还需要include头文件吗?
  • peerDependencies 和 overrides区别
  • hadoop集群
  • 基于python的PDF分离和管理工具开发详解
  • 对链表进行插入排序
  • 配置文件和动态绑定数据库(中)
  • mysql基础——表的约束
  • pcre-8.44-2.ky10.x86_64.rpm怎么安装?CentOS/Kylin系统RPM包安装详细步骤(附安装包)
  • TDengine 聚合函数 COUNT 用户手册
  • STM32F103C8T6开发板入门学习——点亮LED灯
  • K-means 聚类算法:基于鸢尾花数据集的无监督学习全流程解析
  • JVM新生代/老年代垃圾回收器、内存分配与回收策略
  • 介绍一下 RetNet
  • rt-linux下__slab_alloc里的另外一处可能睡眠的逻辑
  • 如何统计DrawMeshInstancedIndirect绘制物体的Triangle数据
  • Android音视频学习路线图
  • 深入理解C语言指针(一)| 从内存到传址调用,掌握指针的核心本质
  • 代码审计-PHP专题原生开发文件上传删除包含文件操作监控Zend源码解密1day分析
  • springboot与vue中webSocket前后端连接问题
  • 数据结构——顺序存储链式存储
  • Vue 脚手架与webpack
  • pytest单元测试框架
  • CentOS7.9绿色安装mysql5.7.44
  • Cell Biology Learning Track(I)膜结构