安装:
建议参考小土堆Pytorch教程的第一课,然后需要1-下载所有Jupiter Notebook的文件并解压;2-pip install d2l
相当于一次性把课程需要用到的包都install,但是这么下亲测很慢,不如到时候用到的时候发现没装,再install
预备知识:
仅说几个我觉得有意思的概念(全文字,一点点代码,懒得写公式),具体torch代码需要用的时候再查or问chatgpt
(一)数据操作
1、Pytorch和Tensorflow中的Tensor张量和Numpy的ndarray = n dim array有何区别?
其实都是n维数组,但Tensor是有对应数学概念的,ndarray纯计算机概念
深度学习喜欢用Tensor是因为(1)Tensor支持GPU加速计算,而ndarray仅支持CPU计算。(2)Tensor支持自动微分
2、Tensor作为n维数组
若只有1个值——标量scalar
若n=1——向量vector
若n=2——矩阵matrix
若n≥2——没别的名字的都叫张量tensor
如:
n=3——一张3通道图像(Channel, Height, Width)
n=4——一个batch的3通道图像(batch_size, C, H, W)
n=5——视频,加了时间轴
3、广播机制
两个张量按元素进行运算操作时,即使形状不同,也可以通过适当复制元素以扩展,使得两个张量具有相同的形状,从而可以进行按元素操作【有的时候的出错点。。】
(二)数据预处理
1、读取数据集
比较简单pd.read.csv
,注意用此读取csv文件时默认第一行为列名。如果没有列名,设置参数header=None
真的实战的时候还是得用Dataset类+Dataloader
读取自己的数据集,详见:
Dataset类:https://www.cnblogs.com/xjl-ultrasound/p/18337058
Dataloader:https://www.cnblogs.com/xjl-ultrasound/p/18339035
2、处理缺失值NaN
比较常用的是 插值(补!)
(1)用均值补inputs = inputs.fillna(input.mean())
(2)如果input中是离散值,如类别,可将NaN自动视为一类。inputs = pd.get_dummies(inputs, dummy_na=True)
。意思是,在不忽视NaN这一类dummy_na=True
的情况下,进行one-hot encoding
(三)线性代数
1、怎么看n维数组,以及降维求和/均值
怎么看Tensor是几维?数开头或结尾的中括号数量
如何理解降维?比如A.sum(axis=1)
。相当于按照这个方向压缩(sum求和各元素)张量,最后得到的tensor维度会缺掉这个维度的数字。
但很多时候,为了便于后续计算,需要非降维求和。可设置参数keepdims=True
;或者换函数A.cumsum(axis=1)
2、各种乘!
(1)基本上用不到的是哈达玛积,按元素乘
(2)常用的是:
两向量的点积:得到一个标量,是两个向量的相同位置元素乘积之和torch.dot(x, y)
矩阵-向量积:要求矩阵m*n维,向量n维,相乘,得到一个m维向量torch.mv(A, x)
。其实是在变换向量的维度。新向量的各个值是老向量所有值的加权和(权重由矩阵决定)。“线性层,全连接层”做的事情
矩阵-矩阵乘法torch.mm(A, B)
3、范数norm
(1)向量的范数:表示一个向量的大小size,但不涉及维度。也就是把一个向量 映射到 标量 的函数
常用的是
L2范数:向量各元素平方和的开根号(模),torch.norm(x)
L1范数:向量各元素绝对值之和,torch.abs(x).sum()
更一般的是Lp范数:\(\|x\|_{p} = (\sum^{n}_{i=1}|x_i|^p)^{1/p}\)
(2)矩阵的范数
Frobenius范数 可视为 矩阵形向量的L2范数,torch.norm(A)
各种“距离”相关的概念,很常用!
(四)微积分
1、torch里都是自动求,但要知道input和output的维度
标量、向量、矩阵互相微分时,input和output的维度见下图
*被李老师的头挡住的维度为(m,l,k,n)
这里可以看出的是,如果在分母上,size会倒一倒,然后和分母的size连一连(消掉紧邻的一样的维度),就变成了output的维度。更多的我也不会了。。。
2、梯度:值变化最大的方向