一. 主题:

0. 理清Pytorch中广播的计算原理

1. 记录Pytorch中较为特殊的计算方法

2. 记录Pytorch矩阵计算方法

二. 广播:

当张量的维度shape不一致时,广播机制会自动调整张量维度使得计算可以顺利进行。

实例1:

张量t2.shape = (3, 4),张量t21.shape = (1, 4),其计算过程如下,将t21复制为shape=(3, 4),然后对应位置相加计算。

python list广播 pytorch广播_取值

计算结果:

python list广播 pytorch广播_奇异值分解_02

实例2:

当两个张量的形状上有两个分量不同时,只要不同的分量仍然有一个取值为1,则仍然可以进行广播。需要理解红色标注字体部分,张量分量不同时,如果分量取值不为1,则不可以进行广播运算。

python list广播 pytorch广播_奇异值分解_03

python list广播 pytorch广播_取值_04

 

python list广播 pytorch广播_python list广播_05

实例3:

两个张量,每一个分量的维度都不同时,仍然可以进行广播运算。

python list广播 pytorch广播_奇异值分解_06

 

总结:广播运算解决张量维度不同的问题,在张量分向量不同时,不同的分量中,有一个需要为1。

三. 逐点运算

相关重要函数整理如下:需要留意的是,这些运算都没有改变原来的数值,若需要改变原输入值,则需要调用函数 function_(),如torch.add(t1, t2),则应该修改为torch.add_(t1, t2)。

Tensor的大多数运算都是具有一定的静态性,静态性指的是,输入的张量有严格的类型要求,因为GPU不会像python一样动态识别数据类型,很多是有我们需要使用float()等方法做类型转换。

python list广播 pytorch广播_奇异值分解_07

 

python list广播 pytorch广播_python list广播_08

python list广播 pytorch广播_python list广播_09

 总结:逐点计算与Numpy 或 pandas计算类似,需要留意function()与function_()的区别。

四. 统计量计算:

常用函数方法整理如下:需要特别留意统计计算中dim参数的使用场合和计算结果

python list广播 pytorch广播_奇异值分解_10

对t2各个方向进行函数的统计计算

python list广播 pytorch广播_pytorch_11

实例1:按列求和

我们知道t3.shape = (2, 3, 4),当dim = 0时,那么输出 out.shape= (3, 4),计算时,是将


[ 0., 1., 2., 3.]与[12., 13., 14., 15.]对应元素一一相加 [ 4., 5., 6., 7.]与[16., 17., 18., 19.]对应元素一一相加 [ 8., 9., 10., 11.]与[20., 21., 22., 23.]对应元素一一相加


其中,由于dim=0对应的shape中(2,3,4)中的2,所以计算求和时,两两元素相加,得到如下结果:

python list广播 pytorch广播_奇异值分解_12

实例2:按行求和

我们知道t3.shape = (2, 3, 4),当dim = 1时,那么输出 out.shape= (2, 4),计算时,是将


[[ 0., 1., 2., 3.], [ 4., 5., 6., 7.], [ 8., 9., 10., 11.]]


按列相加得到 [12., 15., 18., 21.],将如下


[[12., 13., 14., 15.], [16., 17., 18., 19.], [20., 21., 22., 23.]]


按列相加得到 [48., 51., 54., 57.]

python list广播 pytorch广播_矩阵计算_13

 

实例3:从第三个维度求和

我们知道t3.shape = (2, 3, 4),当dim = 2时,那么输出 out.shape= (2, 3),计算时,是将

[ [ 0., 1., 2., 3.],  

  [ 4., 5., 6., 7.], 

  [ 8., 9., 10., 11.] ]

按行相加得到 [ 6., 22., 38.],将如下

[ [12., 13., 14., 15.],

  [16., 17., 18., 19.],

  [20., 21., 22., 23.] ]

按行相加得到 [54., 70., 86.] 

python list广播 pytorch广播_取值_14

 五. 矩阵计算

矩阵形变

python list广播 pytorch广播_矩阵计算_15

python list广播 pytorch广播_矩阵计算_16

 

 在Pytorch中矩阵可直接与向量相乘

python list广播 pytorch广播_奇异值分解_17

 

python list广播 pytorch广播_矩阵计算_18

 

python list广播 pytorch广播_奇异值分解_19

python list广播 pytorch广播_奇异值分解_20

 

 特征分解:

python list广播 pytorch广播_python list广播_21

奇异值分解:

python list广播 pytorch广播_矩阵计算_22

 

奇异值分解反推原矩阵:

 

python list广播 pytorch广播_矩阵计算_23

 总结:通过奇异值分解,可以用更加简略,更少的数据来保存重要的信息。