旅游网站的长图是怎么做的呀,邯郸信息港最新招聘信息2023,网站ppt怎么做,成免费crm特色大爆料目录
什么是广播运算
广播的条件
示例
示例1
示例2
示例3 补1
示例4 原位运算
示例5 参与广播运算的两个tensor#xff0c;必须是从右向左对齐
总结规律
两个tensor可以做广播运算的条件#xff1a;
两个可以互相广播的tensor运算的步骤#xff1a;
例子#x…目录
什么是广播运算
广播的条件
示例
示例1
示例2
示例3 补1
示例4 原位运算
示例5 参与广播运算的两个tensor必须是从右向左对齐
总结规律
两个tensor可以做广播运算的条件
两个可以互相广播的tensor运算的步骤
例子 什么是广播运算
广播发生的场景很广泛tensor加法、乘法等都适用广播语义。广播的意思就是在某些条件下两个形状不同的tensor仍可以完成运算。
广播的条件
两个tensor可以相互广播的条件是
1 每一个tensor至少有一个维度(torch.empty((0,))就是一个没有维度的tensor见下面的例子)
2 从最后一个维度下面解释何为最后一个维度开始逐一比较两个tensor的各个维度这两个被比较的维度要么相等要么有一个是1要么有一个不存在。
何为最后一个维度看下面的例子 X 是一个2行3列的tensor。从它最外面那一层[]括号来看里面有2个元素
[1,2,3]和[4,5,6]
所以X的“首维度”就是从[1,2,3],[4,5,6]---这个方向
再往里一层是123的数列也可以说是4,5,6的数列。这就是X的下一个维度。由于X只有两个维度所以1,2,3(4,5,6)数列的维度就是x的尾维度或者说是最后一个维度。
由于x.shape([2,3])可见有两个元素的维度([1,2,3],[4,5,6]这个维度)排在左边有3个元素的维度(1,2,3或者说4,5,6这个维度)排在右面。故“首维度”排在shape的最左边“尾维度”排在最右边
示例
示例1
准备两个tensor
X形状是5,7,3所有元素都是0
Y形状是5,7,3 所有元素都是1 运算结果 可见add_操作后x的每个元素都加1.
示例2
X没有维度Y是2行2列 可见两者不能相加
示例3 补1
X是一个3x2x2的tensor而y是一个只有两个元素的矢量。 这时有人会有疑问x的维度有俩个“2”y的“2”应该对应哪一个 根据官网Broadcasting semantics — PyTorch 2.2 documentation的说法“If the number of dimensions of x and y are not equal, prepend 1 to the dimensions of the tensor with fewer dimensions to make them equal length.”---把1插在维度较少的tensor的前面。说明pytorch是尽量保持尾部维度对齐的也就是下面的对齐
3 2 2 x 2 y
然后在y的前面插1
3 2 2
1 1 2
y前面的维度补了两个“1”每一次补1y的外面加一层[]。所以补两个1之后y变成[ [ [20,30] ] ]
对齐后沿着第一维度计算
将x视为一个3元矢量矢量的每一个元素是一个2x2 tensor将y视为一个1元矢量矢量唯一的元素是一个1x2的tensor[[20,30]]。接下来让这个3元矢量的每一个元素与这个1x2的tensor相加。
把这个2x2的tensor再看成一个二元矢量每个元素又都是一个2元矢量。而把1x2的tensor看成只有一个元素的矢量且元素本身又是一个2元矢量[20,30]。于是2x2的tensor加1x2的tensor又可以分解成两个二元矢量分别加一个二元矢量[20,30]。举例看[[1,2], [3,4]] [20,30]就是[1,2] [20,30] 和[3,4] [20,30].
重复上述操作给[[5,6],[7,8]]和[[9,10],[11,12]]所以就有了最后的结果x的每一个元素都加上了[20,30] 示例4 原位运算
所谓原位运算指的是运算返回值保存在某一个输入变量中而不是保存在新的变量里。在Karpathy的视频教程中提到P / … 就是一个原位运算。示例2的add_操作也是一个原位运算。
如下图所示x.add_(y)成立但是y.add_(x)不成立 原因是x与y相加时x的维度不需要变化而y的规模要变化才能适配x的形状。由于x.add_(y)的结果保存在x而不是y中所以y的形状变化是暂时的运算结束后就回到原状态。但是反过来则不行y.add_(x)导致结果保存在y中导致运算后y的规模和运算前不同这是不允许的。
示例5 参与广播运算的两个tensor必须是从右向左对齐
这个例子说明参与广播运算的两个tensor必须是从右对齐 从上面的例子xy失败可以看出虽然y(5x2的tensor)可以在最右边补一个1变为5x2x1适配x的规模5x2x4但是广播语义要求参与运算的两个tensor首先把最右边的维度对齐然后再补充维度。所以x的最右边维度4是无法匹配y的最右边维度2的故失败。 总结规律
两个tensor可以做广播运算的条件
1 两个tensor都至少有一个维度
2 两个tensor的维度个数要么完全一样那个维度较少的tensor可以把自己缺少的维度补充为1
3 补齐可以补充多个维度但是只能发生在所有已有维度的左边不能插在已有维度之间也不能出现在已有维度右边。
4 假如运算是原位运算则保存运算结果的变量的尺寸不应在运算前后发生变化。 两个可以互相广播的tensor运算的步骤
1 假如两者维度个数、对应维度的尺寸都相同则直接对应元素做运算得出结果即可
2 假如两者维度不同则
2.1 首先让两个变量的最右边维度对齐
2.2 维度较少的那个变量的左边必然缺少维度缺少几个就从最左边开始补几个1
2.3 从最左边开始运算即是说先处理x1,y1这一对。变量x [x1, x2, x3, … xn]和变量y [y1, y2, y3,….yn]。把[x2,x3,x4…xn]看作一个元素把[y2,y3,y4,…yn]看作一个元素。这样x就被看作是一个含有x1个元素的矢量y被看作是有y1个元素的矢量。根据前面的描述不难发现x1与y1要么相等要么有一个是1.
2.4 假如x1y1则只要把各自对应元素相加即可。每个对应元素又是一个[x2,x3,x4...xn]和[y2,3,y4,..yn]于是计算[x2,x3,x4...xn] [y2,3,y4,..yn]。如果对应元素可以直接相加就返回结果否则回到2.3
2.5 假如x1!y1那么其中必有一个是1。比如说y11。那么xy可以看成是一个x1维矢量加一个标量。矢量加标量只要把标量加到矢量的每一个元素即可。矢量的每个元素都是一个[x2,x3,x4….xn]标量是y1这个维度的元素y1既然等于1就只有一个元素。这两者的加法又回到2.3
重复以上步骤直到最后的维度也就是最右边的维度。
例子
X [ [[1,2,3],[4,5,6]], [[1,1,1],[2,2,2]], [[3,3,3],[4,4,4]] ]
Y [10,20,30]
根据步骤2.1与2.2y要补齐为一个1x1x3的tensor。补齐后
Y [[[10,20,30]]]
除了最里面的维度以外外面的维度都是1.
根据第2.3步从最左边运算所以x被视为一个三元矢量 而Y只有一个元素[[10,20,30]]。所以这个元素要跟上面三者分别做加法。
来看[[1,2,3],[4,5,6]] [[10,20,30]]
显然第一个加数又是一个二元矢量所以回到步骤2.3 Y只有一个元素[10,20,30]。所以用[10,20,30]与上面两个元素分别相加。
于是得出[11,22,33]和[14,25,36]把这两个结果组合起来最终结果的第一个元素就是
[[11,22,33],[14,25,36]]
第二个和第三个元素的计算同理不再赘述。