Pytorch学习之路(3)

一.机器学习任务的整体流程

        1.数据预处理:数据格式统一、异常数据消除、必要数据转换,划分训练集、验证集、测试集

        2.选择模型

        3.设定损失函数、优化方法、对应的超参数

        4.用模型拟合训练集数据,在验证集/测试集上计算模型表现

二.数据读入

        pytorch数据读入通过Dataset+DataLoader的方式完成,Dataset定义好数据的格式和数据变换形式,DataLoader用iterative的方式不断读入批次数据。可以定义自己的Dataset类来实现灵活的数据读取,定义的类需要继承PyTorch自身的Dataset类。主要包含三个函数:

  • __init__: 用于向类中传入外部参数,同时定义样本集

  • __getitem__: 用于逐个读取样本集合中的元素,可以进行一定的变换,并将返回训练/验证所需的数据

  • __len__: 用于返回数据集的样本数

三. 模型构建

Pytorch中神经网络构造一般基于nn.Module类的模型来完成。Module类是torch.nn模块里提供的一个模型构造类,是所有神经网络模块的基类,我们可以继承它来定义我们想要的模型。

神经网络中的层可以通过Module来自定义并被反复调用,包括但不限于:不含模型参数的层、含模型参数的层、二位卷积层(将输入和卷积核做互相关运算,并加上一个标量偏差来得到输出)、池化层(每次对输入数据的一个固定形状窗口(⼜称池化窗口)中的元素计算输出)

一个神经网络典型训练过程:

  1. 定义包含一些可学习参数(或者叫权重)的神经网络

  2. 在输入数据集上迭代

  3. 通过网络处理输入

  4. 计算 loss (输出和正确答案的距离)

  5. 将梯度反向传播给网络的参数

  6. 更新网络的权重,一般使用一个简单的规则:weight = weight - learning_rate * gradient

四.模型初始化 

一般情况下,我们不使用全0初始值训练网络。PyTorch在torch.nn.init中为我们提供了常用的初始化方法。

我们通常会根据实际模型来使用torch.nn.init进行初始化,通常使用isinstance()来进行判断模块属于什么类型。对于不同的类型层要设置不同的权重初始化方法。

初始化数据需要封装,通常定义为initialize_weight()函数并在模型初始后使用。

注: 我们在初始化时,最好不要将模型的参数初始化为0,因为这样会导致梯度消失,从而影响模型的训练效果。因此,我们在初始化时,可以使用其他初始化方法或者将模型初始化为一个很小的值,如0.01,0.1等。

五.损失函数

Pytorch的损失函数一般通过torch.nn调用

1.二分类交叉熵损失函数

2.交叉熵损失函数

3.L1损失函数

4.MSE损失函数

5.平滑L1 (Smooth L1)损失函数

6.目标泊松分布的负对数似然损失

7.KL散度

8.MarginRankingLoss

9.多标签边界损失函数

10.二分类损失函数

11.多分类的折页损失

12.三元组损失

13.HingEmbeddingLoss

14.余弦相似度

15.CTC损失函数

六.训练和评估

加载数据开始训练模型,首先应该设置模型的状态:如果是训练状态,那么模型的参数应该支持反向传播的修改;如果是验证/测试状态,则不应该修改模型参数。

验证/测试的流程基本与训练过程一致,不同点在于:

  • 需要预先设置torch.no_grad,以及将model调至eval模式

  • 不需要将优化器的梯度置零

  • 不需要将loss反向回传到网络

  • 不需要更新optimizer

总结修改自:Datawhale/thorough-pytorch

你可能感兴趣的:(Pytorch学习之旅,学习,人工智能,pytorch,深度学习,笔记)