一. 主题:
0. 理清Pytorch中广播的计算原理
1. 记录Pytorch中较为特殊的计算方法
2. 记录Pytorch矩阵计算方法
二. 广播:
当张量的维度shape不一致时,广播机制会自动调整张量维度使得计算可以顺利进行。
实例1:
张量t2.shape = (3, 4),张量t21.shape = (1, 4),其计算过程如下,将t21复制为shape=(3, 4),然后对应位置相加计算。
计算结果:
实例2:
当两个张量的形状上有两个分量不同时,只要不同的分量仍然有一个取值为1,则仍然可以进行广播。需要理解红色标注字体部分,张量分量不同时,如果分量取值不为1,则不可以进行广播运算。
实例3:
两个张量,每一个分量的维度都不同时,仍然可以进行广播运算。
总结:广播运算解决张量维度不同的问题,在张量分向量不同时,不同的分量中,有一个需要为1。
三. 逐点运算
相关重要函数整理如下:需要留意的是,这些运算都没有改变原来的数值,若需要改变原输入值,则需要调用函数 function_(),如torch.add(t1, t2),则应该修改为torch.add_(t1, t2)。
Tensor的大多数运算都是具有一定的静态性,静态性指的是,输入的张量有严格的类型要求,因为GPU不会像python一样动态识别数据类型,很多是有我们需要使用float()等方法做类型转换。
总结:逐点计算与Numpy 或 pandas计算类似,需要留意function()与function_()的区别。
四. 统计量计算:
常用函数方法整理如下:需要特别留意统计计算中dim参数的使用场合和计算结果。
对t2各个方向进行函数的统计计算
实例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,所以计算求和时,两两元素相加,得到如下结果:
实例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.]
实例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.]
五. 矩阵计算
矩阵形变
在Pytorch中矩阵可直接与向量相乘
特征分解:
奇异值分解:
奇异值分解反推原矩阵:
总结:通过奇异值分解,可以用更加简略,更少的数据来保存重要的信息。