news 2026/2/12 10:17:48

tensorflow 零基础吃透:RaggedTensor 的不规则形状与广播机制 2

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
tensorflow 零基础吃透:RaggedTensor 的不规则形状与广播机制 2

作为初学者,我们先从核心概念拆解开始,用最通俗的语言讲清楚「广播」和「不规则张量(RaggedTensor)」,再一步步拆解每个示例的计算过程,最后总结规律。

一、先搞懂3个基础概念

1. 张量的「维度(阶)」

张量的维度数 = 嵌套括号的层数(最外层算1层):

  • 标量(比如3):0维(无括号)
  • 一维张量(比如[1,2]):1维(1层括号)
  • 二维张量(比如[[1,2],[3]]):2维(2层括号)
  • 三维张量(比如[[[1,2],[3,4]],[[5,6]]]):3维(3层括号)

2. 不规则张量(RaggedTensor)

普通张量的每一行元素个数必须相同(比如[[1,2],[3,4]]),但RaggedTensor允许每行元素个数不同(比如[[1,2],[3]],第一行2个、第二行1个),这是理解示例的关键。

3. 广播的核心目的

逐元素运算(加减乘除)要求两个张量的「每个位置都能一一对应」,但实际中张量形状可能不同。广播就是把形状小的张量「复制扩展」,让它和大张量形状兼容,从而能逐元素运算。

二、广播的2个核心步骤(通俗版)

把官方规则翻译成新手能懂的话:

步骤1:补维度(外层补1)

如果两个张量维度数不一样,给「维度少的那个」的最外层加维度(大小为1),直到两者维度数相同。
👉 比如:标量3(0维)和二维RaggedTensor[[1,2],[3]](2维),先把标量补成[[3]](2维,大小1×1),维度数就匹配了。

步骤2:扩维度(复制值)

对每一个维度,检查两个张量的「大小」:

  • 如果其中一个张量在这个维度的大小是1 → 把它复制成和另一个张量一样的大小;
  • 如果两个张量的大小都不是1,且不相等 → 报错(形状不兼容,无法广播)。

👉 关键:只有「大小为1的维度」能被复制扩展,否则必报错!

三、逐行拆解「能广播」的示例

示例1:标量 + 二维RaggedTensor

x=tf.ragged.constant([[1,2],[3]])# 2维RaggedTensor,形状:2 × (不规则)(第一维2行,第二行分别是2个、1个)y=3# 0维标量print(x+y)# 结果:<tf.RaggedTensor [[4, 5], [6]]>
计算步骤:
  1. 补维度:y是0维,x是2维 → 给y补2层外层维度,变成[[3]](2维,大小1×1)。
  2. 扩维度
    • 第一维(行数):x的大小是2,y的大小是1 → 把y复制成2行:[[3],[3]]
    • 第二维(每行元素数):x是不规则的(2个、1个),y的大小是1 → 把y每行复制成和x一样的个数:[[3,3],[3]]
  3. 逐元素相加
    • 第一行:1+3=42+3=5[4,5]
    • 第二行:3+3=6[6]

示例2:二维RaggedTensor + 二维普通张量

x=tf.ragged.constant([[10,87,12],[19,53],[12,32]])# 2维,形状3×(不规则)(3行,元素数3、2、2)y=[[1000],[2000],[3000]]# 2维普通张量,形状3×1(3行,每行1个)print(x+y)# 结果:<tf.RaggedTensor [[1010, 1087, 1012], [2019, 2053], [3012, 3032]]>
计算步骤:
  1. 补维度:两者都是2维,不用补。
  2. 扩维度
    • 第一维(行数):x和y都是3 → 不用动;
    • 第二维(每行元素数):y是1,x是不规则的(3、2、2)→ 把y每行复制成和x一样的个数:[[1000,1000,1000],[2000,2000],[3000,3000]]
  3. 逐元素相加
    • 第一行:10+1000=101087+1000=108712+1000=1012
    • 第二行:19+2000=201953+2000=2053
    • 第三行:12+3000=301232+3000=3032

示例3:三维RaggedTensor + 二维普通张量

x=tf.ragged.constant([[[1,2],[3,4],[5,6]],[[7,8]]],ragged_rank=1)# 3维,形状2×(不规则)×2(2组,第一组3个子集,第二组1个;每个子集2个元素)y=tf.constant([[10]])# 2维,形状1×1print(x+y)# 结果:<tf.RaggedTensor [[[11, 12],[13, 14],[15, 16]], [[17, 18]]]>
计算步骤:
  1. 补维度:y是2维,x是3维 → 给y补1层外层维度,变成[[[10]]](3维,大小1×1×1)。
  2. 扩维度
    • 第一维(组数):x是2,y是1 → 复制y成2组:[[[10]], [[10]]]
    • 第二维(每组子集数):x是不规则的(3、1),y是1 → 复制y成和x一样的子集数:[[[10],[10],[10]], [[10]]]
    • 第三维(每个子集元素数):x是2,y是1 → 复制y每个子集成2个元素:[[[10,10],[10,10],[10,10]], [[10,10]]]
  3. 逐元素相加
    • 第一组:1+10=11/2+10=123+10=13/4+10=145+10=15/6+10=16
    • 第二组:7+10=17/8+10=18

示例4:四维RaggedTensor + 一维普通张量

x=tf.ragged.constant([[[[1],[2]],[],[[3]],[[4]]],[[[5],[6]],[[7]]]],ragged_rank=2)# 4维,形状2×(不规则)×(不规则)×1(2组,第一组4个子集,第二组2个;子集内元素数不规则;每个元素1个值)y=tf.constant([10,20,30])# 1维,形状3print(x+y)# 结果:<tf.RaggedTensor [[[[11,21,31],[12,22,32]], [], [[13,23,33]], [[14,24,34]]], [[[15,25,35],[16,26,36]], [[17,27,37]]]]>
计算步骤:
  1. 补维度:y是1维,x是4维 → 给y补3层外层维度,变成[[[[10,20,30]]]](4维,大小1×1×1×3)。
  2. 扩维度
    • 前三维:把y复制成和x的不规则维度完全匹配(2组、对应子集数、对应子子集数);
    • 第四维:x是1,y是3 → 把x的每个元素(比如[1])复制成3个值([1,1,1]);
  3. 逐元素相加
    • 1+10=11/1+20=21/1+30=31[11,21,31]
    • 2+10=12/2+20=22/2+30=32[12,22,32]
    • 空子集保持空;
    • 以此类推,最终得到示例结果。

四、拆解「不能广播」的示例(核心:维度大小既不相等,也无1)

示例1:二维RaggedTensor + 二维普通张量

x=tf.ragged.constant([[1,2],[3,4,5,6],[7]])# 2维,形状3×(2、4、1)y=tf.constant([[1,2,3,4],[5,6,7,8],[9,10,11,12]])# 2维,形状3×4# x + y 报错
原因:
  • 第一维(行数):都是3 → 没问题;
  • 第二维(每行元素数):x是2、4、1,y是4 → 第一行x=2≠4且≠1,无法复制匹配 → 报错。

示例2:两个二维RaggedTensor

x=tf.ragged.constant([[1,2,3],[4],[5,6]])# 2维,形状3×(3、1、2)y=tf.ragged.constant([[10,20],[30,40],[50]])# 2维,形状3×(2、2、1)# x + y 报错
原因:
  • 第一维(行数):都是3 → 没问题;
  • 第二维(每行元素数):x=3、1、2,y=2、2、1 → 第一行x=3≠y=2且都≠1 → 无法复制匹配 → 报错。

示例3:三维RaggedTensor + 三维RaggedTensor

x=tf.ragged.constant([[[1,2],[3,4],[5,6]],[[7,8],[9,10]]])# 3维,形状2×(3、2)×2y=tf.ragged.constant([[[1,2,0],[3,4,0],[5,6,0]],[[7,8,0],[9,10,0]]])# 3维,形状2×(3、2)×3# x + y 报错
原因:
  • 前两维都匹配 → 没问题;
  • 第三维(每个子集元素数):x=2,y=3 → 都≠1且不相等 → 无法复制匹配 → 报错。

五、新手必记的广播核心规律

  1. 补维度只补外层:比如0维标量补成2维是[[3]],不是[3,]
  2. 扩维度只复制「大小为1」的维度:只有维度大小是1时,才能复制成目标大小;
  3. 不规则张量的兼容条件:不规则维度的「大小」要么和另一个张量相等,要么另一个张量在该维度大小为1;
  4. 报错唯一原因:某维度上,两个张量的大小既不相等,也没有一个是1 → 无法广播。

记住这4条,再回头看示例,就能清晰理解每一步的计算逻辑了。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/2/5 13:00:08

百度网盘资源过期?官方GitHub镜像提供稳定Qwen-Image下载

百度网盘资源过期&#xff1f;官方GitHub镜像提供稳定Qwen-Image下载 在AI生成内容&#xff08;AIGC&#xff09;浪潮席卷创意产业的今天&#xff0c;越来越多企业与开发者开始将文生图模型集成到设计流程中。然而&#xff0c;一个令人头疼的现实问题始终存在&#xff1a;从社区…

作者头像 李华
网站建设 2026/2/10 3:17:48

易代账结账和反结账流程

【问题现象】如何结账与反结账&#xff1f;【解决方法】结账&#xff1a;当本月所有相关凭证制作完成&#xff0c;点击 设置→结账→马上检查→结账&#xff1b;2.如何反结账&#xff08;1&#xff09;点击【结账】-【结账】&#xff0c;选择需反结账的月份&#xff0c;点击【反…

作者头像 李华
网站建设 2026/2/12 7:21:05

Vue-next-admin:现代化Vue3后台管理系统完整指南

Vue-next-admin&#xff1a;现代化Vue3后台管理系统完整指南 【免费下载链接】vue-next-admin &#x1f389;&#x1f389;&#x1f525;基于vue3.x 、Typescript、vite、Element plus等&#xff0c;适配手机、平板、pc 的后台开源免费模板库&#xff08;vue2.x请切换vue-prev-…

作者头像 李华
网站建设 2026/2/8 18:52:55

Git 下载大型模型文件时使用LFS管理Qwen3-VL-8B权重

Git 下载大型模型文件时使用LFS管理Qwen3-VL-8B权重 在AI项目开发中&#xff0c;一个常见的痛点是&#xff1a;如何高效地版本化和分发那些动辄数GB的模型权重文件&#xff1f;传统的Git操作面对这类大文件常常显得力不从心——克隆慢、存储膨胀、协作卡顿。尤其是在处理像 Qw…

作者头像 李华
网站建设 2026/2/6 8:15:33

三步快速解密音乐文件:免费工具完整指南

三步快速解密音乐文件&#xff1a;免费工具完整指南 【免费下载链接】unlock-music 在浏览器中解锁加密的音乐文件。原仓库&#xff1a; 1. https://github.com/unlock-music/unlock-music &#xff1b;2. https://git.unlock-music.dev/um/web 项目地址: https://gitcode.co…

作者头像 李华
网站建设 2026/2/7 0:39:29

轻量级视频生成时代来临:Wan2.2-T2V-5B应用前景分析

轻量级视频生成时代来临&#xff1a;Wan2.2-T2V-5B应用前景分析 在短视频日均播放量突破数百亿次的今天&#xff0c;内容创作者正面临一个矛盾现实&#xff1a;用户对视觉创意的需求越来越“快、多、新”&#xff0c;而传统视频制作流程却依然缓慢且昂贵。一条30秒广告片动辄需…

作者头像 李华