2. Pytorch
2.1 Pytorch是什么
Python的一个机器学习框架
特点:
- 高位矩阵计算用GPU
- 梯度计算等常用方法封装的很好
2.2 流程
2.2.1 步骤一:加载数据
2.2.1.1 定义自己的Dataset
通过继承Dataset就可以定义自己的Dataset,重要方法如下
2.2.1.2 用DataLoader分组
将dataset分组并合并到dataloader,有并行机制
shuffle为是否打乱数据,一般
- 在训练时设置True
- 在测试时False
2.2.1.3 张量Tensors
张量是一个多维数组
可以使用shape()方法查看形状,其中dim定义与NumPy中axis定义相同(如果学过NumPy的更好理解一些)
2.2.1.3.1 创建Tensors
可以使用python的list以及numpy的数组直接创建
也可以使用zeros以及ones方法创建全部为浮点型的0和1数组
2.2.1.3.2 常用运算
2.2.1.3.2.1 算术运算
2.2.1.3.2.2 维度互换
用transpose方法做维度互换的操作
例如transpose(0,1)将第0维度和第1维度呼唤
2.2.1.3.2.3 去除维度
用squeeze方法可以去除掉长度为1的指定维度
2.2.1.3.2.4 增加维度
用unsqueeze方法可以反过来加一个维度
2.2.1.3.2.5 合并tensors
可以使用cat方法完成tensors的合并,参数传入tensors列表以及合并的维度
2.2.1.3.2.6 梯度计算
梯度计算非常简单
- 加载数据,设置requires_grad为True
- 将模型函数写出来
- 使用backward()方法求偏导
- 使用grad属性,拿到每位的偏导值
2.2.1.3.3 数据类型
使用dtype属性查看,若有冲突问题:详情问题见官网文档
2.2.1.3.4 设备
可用to()方法将tensors转移到合适的设备,默认是cpu
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
2.2.2.2 激活函数
2.2.2.3 创建模型
- 首先先继承nn.Module定义自己的模型
- 用nn.Sequential()方法或者手动定义网络的每一层
- 使用forward方法计算网络的输出
以下是两种等价写法
2.2.3 步骤三:定义Loss
MSE常用于回归任务,CrossEntropy常用于分类任务
2.2.4 步骤四:优化
Pytorch提供了常见的算法
SGD为最基本的梯度下降方法
训练的三步骤
- 重置:将上一步算出的梯度归零
- 算梯度:根据预测结果算梯度
- 调整参数:根据梯度调整模型的参数
2.2.5 步骤五:整个程序
2.2.5.0 总体流程
2.2.5.1 定义
2.2.5.2 训练
- 一共训练n_epochs次
- 将模型设置训练模式
- 遍历dataloader,拿到训练数据
- 重置梯度
- 设置tensors的计算设备
- 算结果
- 算loss
- 算梯度
- 调整参数
2.2.5.3 验证
- 将模型设置测试模式
- 遍历dataloader拿到验证数据
- 设置tensors计算设备
- 关掉梯度计算
- 计算结果
- 计算loss的总和以及平均值
2.2.5.4 测试
- 将模型设置测试模式
- 遍历dataloader拿到测试数据
- 设置tensors计算设备
- 关掉梯度计算
- 计算结果
- 收集结果
2.2.5.5 Notice
为什么设置测试模式:会改变模型的辅助功能
为什么关掉梯度计算:
- 梯度计算用于优化,测试时不需要,会加速一些些
- 避免用验证资料或测试资料去训练模型