佛山公司建站织梦dedecms女性时尚门户网站模板
佛山公司建站,织梦dedecms女性时尚门户网站模板,信阳电子商务网站建设,汕头seo推广外包作为初学者#xff0c;我们先从核心概念拆解开始#xff0c;用最通俗的语言讲清楚「广播」和「不规则张量#xff08;RaggedTensor#xff09;」#xff0c;再一步步拆解每个示例的计算过程#xff0c;最后总结规律。
一、先搞懂3个基础概念
1. 张量的「维度#xff08;…作为初学者我们先从核心概念拆解开始用最通俗的语言讲清楚「广播」和「不规则张量RaggedTensor」再一步步拆解每个示例的计算过程最后总结规律。一、先搞懂3个基础概念1. 张量的「维度阶」张量的维度数 嵌套括号的层数最外层算1层标量比如30维无括号一维张量比如[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直到两者维度数相同。 比如标量30维和二维RaggedTensor[[1,2],[3]]2维先把标量补成[[3]]2维大小1×1维度数就匹配了。步骤2扩维度复制值对每一个维度检查两个张量的「大小」如果其中一个张量在这个维度的大小是1 → 把它复制成和另一个张量一样的大小如果两个张量的大小都不是1且不相等 → 报错形状不兼容无法广播。 关键只有「大小为1的维度」能被复制扩展否则必报错三、逐行拆解「能广播」的示例示例1标量 二维RaggedTensorxtf.ragged.constant([[1,2],[3]])# 2维RaggedTensor形状2 × (不规则)第一维2行第二行分别是2个、1个y3# 0维标量print(xy)# 结果tf.RaggedTensor [[4, 5], [6]]计算步骤补维度y是0维x是2维 → 给y补2层外层维度变成[[3]]2维大小1×1。扩维度第一维行数x的大小是2y的大小是1 → 把y复制成2行[[3],[3]]第二维每行元素数x是不规则的2个、1个y的大小是1 → 把y每行复制成和x一样的个数[[3,3],[3]]逐元素相加第一行134235→[4,5]第二行336→[6]。示例2二维RaggedTensor 二维普通张量xtf.ragged.constant([[10,87,12],[19,53],[12,32]])# 2维形状3×(不规则)3行元素数3、2、2y[[1000],[2000],[3000]]# 2维普通张量形状3×13行每行1个print(xy)# 结果tf.RaggedTensor [[1010, 1087, 1012], [2019, 2053], [3012, 3032]]计算步骤补维度两者都是2维不用补。扩维度第一维行数x和y都是3 → 不用动第二维每行元素数y是1x是不规则的3、2、2→ 把y每行复制成和x一样的个数[[1000,1000,1000],[2000,2000],[3000,3000]]逐元素相加第一行101000101087100010871210001012第二行19200020195320002053第三行12300030123230003032。示例3三维RaggedTensor 二维普通张量xtf.ragged.constant([[[1,2],[3,4],[5,6]],[[7,8]]],ragged_rank1)# 3维形状2×(不规则)×22组第一组3个子集第二组1个每个子集2个元素ytf.constant([[10]])# 2维形状1×1print(xy)# 结果tf.RaggedTensor [[[11, 12],[13, 14],[15, 16]], [[17, 18]]]计算步骤补维度y是2维x是3维 → 给y补1层外层维度变成[[[10]]]3维大小1×1×1。扩维度第一维组数x是2y是1 → 复制y成2组[[[10]], [[10]]]第二维每组子集数x是不规则的3、1y是1 → 复制y成和x一样的子集数[[[10],[10],[10]], [[10]]]第三维每个子集元素数x是2y是1 → 复制y每个子集成2个元素[[[10,10],[10,10],[10,10]], [[10,10]]]逐元素相加第一组11011/2101231013/4101451015/61016第二组71017/81018。示例4四维RaggedTensor 一维普通张量xtf.ragged.constant([[[[1],[2]],[],[[3]],[[4]]],[[[5],[6]],[[7]]]],ragged_rank2)# 4维形状2×(不规则)×(不规则)×12组第一组4个子集第二组2个子集内元素数不规则每个元素1个值ytf.constant([10,20,30])# 1维形状3print(xy)# 结果tf.RaggedTensor [[[[11,21,31],[12,22,32]], [], [[13,23,33]], [[14,24,34]]], [[[15,25,35],[16,26,36]], [[17,27,37]]]]计算步骤补维度y是1维x是4维 → 给y补3层外层维度变成[[[[10,20,30]]]]4维大小1×1×1×3。扩维度前三维把y复制成和x的不规则维度完全匹配2组、对应子集数、对应子子集数第四维x是1y是3 → 把x的每个元素比如[1]复制成3个值[1,1,1]逐元素相加11011/12021/13031→[11,21,31]21012/22022/23032→[12,22,32]空子集保持空以此类推最终得到示例结果。四、拆解「不能广播」的示例核心维度大小既不相等也无1示例1二维RaggedTensor 二维普通张量xtf.ragged.constant([[1,2],[3,4,5,6],[7]])# 2维形状3×(2、4、1)ytf.constant([[1,2,3,4],[5,6,7,8],[9,10,11,12]])# 2维形状3×4# x y 报错原因第一维行数都是3 → 没问题第二维每行元素数x是2、4、1y是4 → 第一行x2≠4且≠1无法复制匹配 → 报错。示例2两个二维RaggedTensorxtf.ragged.constant([[1,2,3],[4],[5,6]])# 2维形状3×(3、1、2)ytf.ragged.constant([[10,20],[30,40],[50]])# 2维形状3×(2、2、1)# x y 报错原因第一维行数都是3 → 没问题第二维每行元素数x3、1、2y2、2、1 → 第一行x3≠y2且都≠1 → 无法复制匹配 → 报错。示例3三维RaggedTensor 三维RaggedTensorxtf.ragged.constant([[[1,2],[3,4],[5,6]],[[7,8],[9,10]]])# 3维形状2×(3、2)×2ytf.ragged.constant([[[1,2,0],[3,4,0],[5,6,0]],[[7,8,0],[9,10,0]]])# 3维形状2×(3、2)×3# x y 报错原因前两维都匹配 → 没问题第三维每个子集元素数x2y3 → 都≠1且不相等 → 无法复制匹配 → 报错。五、新手必记的广播核心规律补维度只补外层比如0维标量补成2维是[[3]]不是[3,]扩维度只复制「大小为1」的维度只有维度大小是1时才能复制成目标大小不规则张量的兼容条件不规则维度的「大小」要么和另一个张量相等要么另一个张量在该维度大小为1报错唯一原因某维度上两个张量的大小既不相等也没有一个是1 → 无法广播。记住这4条再回头看示例就能清晰理解每一步的计算逻辑了。