搜索

万字详解pytorch基础语法(二)

发布网友 发布时间:2024-10-28 16:25

我来回答

1个回答

热心网友 时间:2024-10-28 16:46

前篇传送门:4 张量操作

4.1 拼接

torch.cat()

功能:将张量按维度dim进行拼接,不会扩充张量的维度。

● tensors:张量序列

● dim:要拼接的维度

torch.stack()

功能:在新创建的维度dim上进行拼接,会扩充张量的维度。

● tensors:张量序列

● dim:要拼接的维度

4.2 切分

torch.chunk()

功能:将张量按维度dim进行平均切分。

返回值:张量列表。

注意事项:若不能整除,最后一份张量小于其他张量。

● input:要切分的张量

● chunks:要切分的份数

● dim:要切分的维度

torch.split()

功能:将张量按维度dim进行切分。

返回值:张量列表。

● tensor:要切分的张量

● split_size_or_sections:为int时,表示每一份的长度;为list时,按list元素切分

● dim:要切分的维度

4.3 比较

torch.ge(),torch.gt(),torch.le(),torch.lt()

功能:input中逐元素与other进行比较,满足:ge >=; gt >; le <=; lt

返回值:与input同形状的布尔类型张量。

● input:被比较的张量

● other:可以是张量,数值,布尔,input中逐元素与其进行比较

4.4 索引

torch.index_select()

功能:在维度dim上,按index索引数据。

返回值:索引得到的数据拼接的张量。

● input:要索引的张量

● dim:要索引的维度

● index:要索引数据的序号组成的张量,dtype须为torch.long

torch.masked_select()

功能:按mask中的True进行索引,常用来筛选数据。

返回值:一维张量,符合要求的所有数值。

● input:要索引的张量

● mask:与input同形状的布尔类型张量

4.5 变换

torch.reshape()

功能:变换张量形状。

注意事项:当张量在内存中是连续的时,新张量与input共享数据内存。这种共享与out不同,out是整个tensor都共享内存,相当于别名;reshape是仅data共享内存。改变一个张量的数据,另一个张量会跟着改变。

● input:要变换的张量

● shape:新张量的形状,新张量与原张量乘积相等

-1表示不需要关心该维度,根据其他维度计算。

torch.transpose()

功能:交换张量的两个维度。在图像的预处理中常用,有时读取的图像数据是 (c, h, w),但是我们常用的是 (h, w, c),就需要用此方法把channel和width变换,再把width和height变换。

● input:要变换的张量

● dim0:要交换的维度

● dim1:要交换的维度

torch.t()

功能:2维张量转置,对矩阵而言,等价于torch.transpose(input, 0, 1)。

torch.squeeze()

功能:压缩长度为1的维度(轴)。

● dim:若为None,移除所有长度为1的轴;若指定维度,当且仅当该轴长度为1时,可以被移除。

torch.unsqueeze()

功能:依据dim扩展维度。

● dim:扩展的维度

4.6 数学运算

加减乘除

对数,指数,幂函数

三角函数

绝对值

torch.add()

功能:逐元素计算[公式],因为深度学习中经常用到先乘后加的操作,所以增加了此功能,可以使代码更加整洁。

● input:第一个张量

● alpha:乘项因子

● other:第二个张量

torch.addcdiv()

功能:逐元素计算[公式],优化过程中常用。

torch.addcmul()

功能:逐元素计算[公式],优化过程中常用。

5 线性回归

概念:线性回归是分析一个变量与另外一或多个变量之间关系的方法。

求解步骤:

LR为步长,学习率

6 计算图与动态图机制

6.1 计算图

计算图是用来描述运算的有向无环图。计算图的好处是运算更加简洁,求导更加方便。

计算图有两个主要元素:结点(Node) 和边(Edge)。

● 结点表示数据,如向量,矩阵,张量;

● 边表示运算,如加减乘除卷积等。

用计算图表示:[公式],拆分成 [公式]

[公式]

代码验证:

叶子结点:用户创建的结点,如上图中的X与W,梯度反向传播之后,非叶子节点的梯度会被释放掉,可以节省内存。若想使用非叶子节点的梯度,可以用 retain_grad()。

● torch.Tensor中的属性,is_leaf:指示张量是否为叶子结点

● grad_fn:记录创建该张量时所用的方法(函数),在梯度反向传播是用到

● y.grad_fn =[公式]MulBackward0[公式],乘法得到

● a.grad_fn =[公式]AddBackward0[公式],加法得到

● b.grad_fn =[公式]AddBackward0[公式]

6.2 动态图机制

动态图 vs 静态图

根据计算图搭建方式,可将计算图分为动态图和静态图

PyTorch采用的是动态图机制,每一次训练,都会销毁计算图并重新创建,这样做花销很大,但是更加灵活。

TensorFlow采用的是静态图机制,一旦定义,训练时就不能修改。一开始就要搭建好计算图,然后才能进行数据的传输和计算,这意味着写代码过程中,错误将更加难以发现,因为搭建图的过程中不会报错,所以不知道错在哪里,只有在传入数据的过程中才能发现哪里出错,灵活性低,而且出现bug也不易调试。

7 autograd - 自动求导系统

深度学习模型的训练,就是不断更新权值,权值的更新需要求解梯度,求解梯度十分繁琐,PyTorch提供自动求导系统,我们只要搭建好前向传播的计算图,就能获得所有张量的梯度。

7.1 torch.autograd.backward()

功能:自动求取梯度。

● tensors:用于求导的张量,如 loss

● retain_graph:保存计算图,由于PyTorch采用动态图机制,在每次反向传播之后计算图都会释放掉,如果还想继续使用,就要设置此参数为True

● create_graph:创建导数计算图,用于高阶求导

● grad_tensors:多梯度权重,当有多个loss需要计算梯度时,需要设置每个loss的权值

示例1:y.backward()与torch.autograd.backward()的关系

调试:

在 y.backward() 处设置断点,step into进入函数

可以看到张量中的类方法只有一行,说明 y.backward() 直接调用了torch.autograd.backward()方法。

点击单步调试 step over 返回 y.backward(),停止调试。

示例2:retain_graph,保存计算图

多次执行y.backward()会报错,因为计算图被释放,解决方法是第一次反向传播时,设置y.backward(retain_graph=True)

示例3:grad_tensors,多梯度权重

[公式]

7.2 torch.autograd.grad()

功能:求取梯度。

● outputs:用于求导的张量,如上例中的 loss

● inputs:需要梯度的张量,如上例中的w

● create_graph:创建导数计算图,用于高阶求导

● retain_graph:保存计算图

● grad_outputs:多梯度权重

示例:计算[公式] 的二阶导数

7.3 小贴士

1、梯度不自动清零,在每次反向传播中会叠加

这导致我们得不到正确的结果,所以需要手动清零

这里zero后接下划线_,表示原位(in-place)操作。

2、依赖于叶子结点的结点(如上例中的a和b),requires_grad默认为True,因为叶子结点梯度的计算与该节点有关

可以看出虽然只针对x和w设置了requires_grad,但a,b,y也均为True

3、叶子结点不可执行in-place,因为前向传播记录了叶子节点的地址,反向传播需要用到叶子节点的数据时,要根据地址寻找数据,执行in-place操作改变了地址中的数据,梯度求解也会发生错误。

in-place操作,即原位操作,在原始内存中改变这个数据,方法后接_代表in-place操作

8 逻辑回归

逻辑回归是线性的二分类模型。

模型表达式:[公式]

[公式] 称为Sigmoid函数,也称为 Logistic 函数,作用是将输入数据映射到[0, 1]之间。

二分类方法

[公式]

假如没有激活函数[公式],单纯用 [公式],其实也可以进行二分类,对应图像可以看出,[公式] 时判别为类别1,[公式] 0时判别为类别0。为了更好的描述分类置信度,所以采用Sigmoid函数将输出映射到 [公式],符合概率取值。

逻辑回归也叫对数几率回归,几率就是[公式],其中[公式]为概率,表示样本x为正样本的可能性。对几率取对数,就得到了对数几率 [公式]。线性回归 [公式] 是用 [公式] 去拟合 [公式],[公式] 为逻辑回归模型表达式的恒等变形,是用[公式]去拟合对数几率, 因此叫做对数几率回归。

9 机器学习的训练步骤

9.1 数据

● 数据收集:收集原始样本和标签,如Img和Label。

● 数据划分:划分成训练集train,用来训练模型;验证集valid,验证模型是否过拟合,挑选还没有过拟合的时候的模型;测试集test,测试挑选出来的模型的性能。

● 数据读取:PyTorch中数据读取的核心是Dataloader。Dataloader分为Sampler和DataSet两个子模块。Sampler的功能是生成索引,即样本序号;DataSet的功能是根据索引读取样本和标签。

● 数据预处理:数据的中心和,标准化,旋转,翻转等,在PyTorch中是通过transforms实现的。

9.2 选择模型

根据任务的难易程度选择简单的线性模型或者复杂的神经网络模型。

9.3 损失函数

根据不同的任务选择不同的损失函数,比如线性回归中选择均方差损失函数,分类选择交叉熵。

9.4 优化器

有了loss就可以求取梯度,得到梯度,用优化器更新权值。

9.5 迭代训练

反复训练的过程
声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。
E-MAIL:11247931@qq.com
Top