目录
17.x.grad(用x.requires_grad_(True)记录梯度)
李沐大神b站官方视频:【动手学深度学习v2】
04 数据操作 + 数据预处理
1.numel(),reshape()
可以使用numel()函数查询张量的总大小。reshape()可以用-1代替其中一个维度,系统会自动计算其大小(注意只能留一个-1)。
x = torch.arange(16)
x
'''
输出:tensor([ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15])
'''
x.reshape(4,4)
x.numel()
'''
输出:16
'''
X = x.reshape(-1,4)
X
'''
输出:tensor([[ 0, 1, 2, 3],
[ 4, 5, 6, 7],
[ 8, 9, 10, 11],
[12, 13, 14, 15]])
'''
2. ** 求幂运算
**是求幂运算。
3.cat()
cat()函数可以用来拼接张量,dim用来选择拼接的维度。
4. == 通过逻辑运算符构建二元张量
5. sum()
返回的是单元素张量。
6.广播机制
如果两个张量满足下面两个条件,就可以广播:
- 每个张量都至少有一个维度。
- 从两个张量的尾维度开始处理(尾对齐),对应的维度要么相等要么其中一个等于1(其中一个的维度总数可以小于另一个,系统会自动拓展空缺维度为1)。
如果两个张量可以进行广播,进行运算:
- 将两个张量的维度总数调成一致的(如(3,2,2)与(2,2)补成(3,2,2)与(1,2,2))。
- 从尾部开始广播成相同大小的张量(如(3,2,2)与(2,2)广播成(3,2,2)与(3,2,2))。
7.节省内存
很多习以为常的操作都会占用新的内存,影响程序运行,如Y = X + Y得到的Y会占用新内存来存储,可以用Y[:] = X + Y 或者 Y += X来避免。
8.类型转换
可以使用自带的函数来做tensor与numpy的互相转换,也可以用内置函数来转换单元素tensor。
9.缺省值处理
可以用删除法和插值法进行处理。其中删除法是直接将有缺省值的数据删除,而插值法则是将缺省值作为一个新的类型,可以在后续将此有缺省值的特征进行编码或者制作成如下图所示的类似one-hot的样式(如果此特征对应种类较少)。
然后就可以用to_numpy()函数来进行类型转换得到tensor。
05 线性代数 06 矩阵运算
10.转置矩阵 A.T
11.Hadamard积:对应元素相乘(数学符号⊙)
12.利用sum()函数压缩降维
13.非降维求和
可以添加keepdims=True来防止降维,可以借此来让原矩阵除以此求和矩阵。
14.cumsum()函数
15.向量点积与矩阵乘法(Dot Product)
16.范数(norm)
非正式地说,向量的范数是表示一个向量的数值有多大,即向量范数是将向量映射到标量的函数f,比如Lp范数及其的特例(L1,L2)。其满足一些条件,比如李沐老师列举的:
范数的性质也使得它经常被用来解决优化问题,比如最大值/最小值预测值与真实值的距离等等。
07 自动求导
17.x.grad(用x.requires_grad_(True)记录梯度)
18.非标量变量的反向传播
当最终结果不是一个标量时,我们往往算出这个矩阵y的总和sum,然后反向传播时会自动计算出每个样本对应的偏导数作为梯度进行传播。
或者当我们需要对一个张量进行反向传播的时候,我们就想要对函数的参数gradient传入一个与x长度一致的张量来确定每个部分求导的系数。
19.分离计算
可以记录下复合函数中的一个步骤,将整个过程分段,再分别进行求导和反向传播。
这里是将z = y * x 中的y分离出来进行计算,并在转播了z得到的梯度后再计算y的。
20. .detach()与.detach_()函数
.detach_()会切断当前的传播途径,使得前面的节点脱离传播树,比如x->y->z会变为x,y->z,而且不可逆。
.detach()则会返回一个新的tensor,但仍然指向原来传播途径的对应节点,不会改变传播树,而且修改此返回的tensor会影响整个传播流程。
21.Python控制流的也能够自动求导
在如if,else等控制流下自动求导也能够很好地求出梯度与反向传播,不用担心。