李宏毅助教Pytorch教学

21 阅读6分钟

2. Pytorch

2.1 Pytorch是什么

Python的一个机器学习框架

特点:

  • 高位矩阵计算用GPU
  • 梯度计算等常用方法封装的很好

2.2 流程

2.2.1 步骤一:加载数据

2.2.1.1 定义自己的Dataset

通过继承Dataset就可以定义自己的Dataset,重要方法如下

image.png

2.2.1.2 用DataLoader分组

将dataset分组并合并到dataloader,有并行机制

image.png

shuffle为是否打乱数据,一般

  • 在训练时设置True
  • 在测试时False
2.2.1.3 张量Tensors

张量是一个多维数组

image.png

可以使用shape()方法查看形状,其中dim定义与NumPy中axis定义相同(如果学过NumPy的更好理解一些)

2.2.1.3.1 创建Tensors

image.png

可以使用python的list以及numpy的数组直接创建

也可以使用zeros以及ones方法创建全部为浮点型的0和1数组

2.2.1.3.2 常用运算
2.2.1.3.2.1 算术运算

image.png

2.2.1.3.2.2 维度互换

用transpose方法做维度互换的操作

例如transpose(0,1)将第0维度和第1维度呼唤

image.png

2.2.1.3.2.3 去除维度

用squeeze方法可以去除掉长度为1的指定维度

image.png

2.2.1.3.2.4 增加维度

用unsqueeze方法可以反过来加一个维度

image.png

2.2.1.3.2.5 合并tensors

可以使用cat方法完成tensors的合并,参数传入tensors列表以及合并的维度

image.png

2.2.1.3.2.6 梯度计算

梯度计算非常简单

  1. 加载数据,设置requires_grad为True
  2. 将模型函数写出来
  3. 使用backward()方法求偏导
  4. 使用grad属性,拿到每位的偏导值

image.png

2.2.1.3.3 数据类型

使用dtype属性查看,若有冲突问题:详情问题见官网文档

2.2.1.3.4 设备

可用to()方法将tensors转移到合适的设备,默认是cpu

image.png

2.2.2 步骤二:定义模型

2.2.2.1 线性函数

torch.nn.Linear(size of each input sample,size of each output sample)方法用于定义一个Linear Layer

例如Linear(32,64)用于定义一个输入样本维度是32,输出样本维度是64的Linear Layer

image.png

2.2.2.2 激活函数

image.png

2.2.2.3 创建模型
  1. 首先先继承nn.Module定义自己的模型
  2. 用nn.Sequential()方法或者手动定义网络的每一层
  3. 使用forward方法计算网络的输出

以下是两种等价写法

image.png

2.2.3 步骤三:定义Loss

image.png

MSE常用于回归任务,CrossEntropy常用于分类任务

2.2.4 步骤四:优化

Pytorch提供了常见的算法

SGD为最基本的梯度下降方法

image.png

训练的三步骤

  1. 重置:将上一步算出的梯度归零
  2. 算梯度:根据预测结果算梯度
  3. 调整参数:根据梯度调整模型的参数

2.2.5 步骤五:整个程序

2.2.5.0 总体流程

image.png

2.2.5.1 定义

image.png

2.2.5.2 训练

image.png

  1. 一共训练n_epochs次
  2. 将模型设置训练模式
  3. 遍历dataloader,拿到训练数据
  4. 重置梯度
  5. 设置tensors的计算设备
  6. 算结果
  7. 算loss
  8. 算梯度
  9. 调整参数
2.2.5.3 验证

image.png

  1. 将模型设置测试模式
  2. 遍历dataloader拿到验证数据
  3. 设置tensors计算设备
  4. 关掉梯度计算
  5. 计算结果
  6. 计算loss的总和以及平均值
2.2.5.4 测试

image.png

  1. 将模型设置测试模式
  2. 遍历dataloader拿到测试数据
  3. 设置tensors计算设备
  4. 关掉梯度计算
  5. 计算结果
  6. 收集结果
2.2.5.5 Notice

为什么设置测试模式:会改变模型的辅助功能

为什么关掉梯度计算:

  • 梯度计算用于优化,测试时不需要,会加速一些些
  • 避免用验证资料或测试资料去训练模型
2.2.5.6 存档/加载

image.png