小土堆Pytorch
B站UP主小土堆的Pytorch入门教程,很简短精炼。注意不会就看官方文档,Pytorch文档关于各部分讲解其实都挺详细的。
Dir()和help()工具的使用- Pycharm中控制台可以查看实时变量以及属性
- 加载数据
- Dataset:提供一种方式去获取数据及其label
- 如何获取每一个数据及其label
- 告诉我们总共有多少数据
- Dataloader:打包数据,为后面的网络提供不同的数据形式
- Dataset:提供一种方式去获取数据及其label
- Dataset:
- 继承
Dataset,__init__初始化一些必要属性和变量。 - 重写
__getitem__(self, idx)方法,return输入和对应的label。 - 重写
__len__(self)方法,返回数据集的长度。
- 继承
- TensorBoard:可视化记录训练过程中一些指标
- DataLoader:
- 决定每次取几张牌,几只手取牌。
batch_size:每次取几张牌。shuffle:是否打乱牌。num_workers:多线程读取数据。drop_last:是否丢弃最后不满的批次。- 分别打包输入和label。
for data in train_loader:读取一批数据。
- 网络的搭建
- 主要在
torch.nn这个模块中。 - Container:网络骨架
- Module:定义网络必须继承
- forward:input经过网络中的forward中的操作得到输出output
- 网络其实就是一个类,也没什么了不起的
- Module:定义网络必须继承
- 神经网络:卷积层、最大池化、非线性激活
- 最大池化:减少参数量,训练更快,类似于1080p到720p?
- 非线性激活:为网络引入非线性特征,本质就是对输入做一次非线性运算,提升模型泛化能力,无非是非线性公式不一样。
- 正则化层
- 线性层,指定in_features和out_features
- Sequential:组织多层网络结构,按照顺序
- 可以使用一些初始值从网络过一遍看看能否无报错,且产生我们期望的输出维度。
- 损失函数和反向传播
- 损失函数:衡量实际输出和期望输出之间的差距,指导output去接近target
- 损失函数是越小越好
- 计算实际输出和目标之间的差距
- 为我们更新输出提供一定的依据(反向传播)
- L1loss、MSE、CrossEntropy
- 交叉熵:常用于分类问题
- 损失函数:衡量实际输出和期望输出之间的差距,指导output去接近target
- 优化器:
- 利用反向传播求出的梯度优化模型参数。
torch.optim中,注意将上一次的梯度清零- lr:learning rate学习率1e-2 = 1 * (10)^(-2) = 0.01
- 其实很套路,就那么几个地方,定义优化器、优化器清零、优化器进行一步优化
- dataloader外面再加一层循环,也就是将数据多个epoch进行训练,不断地训练整个模型
- 主要在
- 现有网络模型的使用及修改
torchvison.models中有一些已经定义好的模型。pretrainded参数为True或者False分别下载是否已经在对应数据集上调整好参数的模型。- 现有网络
add_module添加网络结构,由此可以修改现有网络适应新任务。 - 直接修改某一个网络结构?
vgg16_false.classifier[6] = nn.Linear(4096, 10)就可以直接实现一个替换,也就是直接赋值。
- 网络模型的保存和读取
- 套路建议多看看官方文档。
- 模型保存方式1:
torch.save(model, "xxx.pth"),保存模型结构和参数。 - 模型加载方式1:
model = torch.load("xxx.pth") - 模型保存方式2:
torch.save(model.state_dict(), "xxx.pth")只将模型参数保存下来,官方推荐。 - 模型加载方式2:
model = torch.load("xxx.pth"),先加载模型结构,再model.state_dict()添加模型参数。 - 陷阱?方式一加载模型的时候,一定要将模型结构也加载进来。因此需要import或者在当前文件中定义好模型结构。不过新版似乎不需要手动这一步?
- 完整的模型训练套路
- 搭建神经网络结构,一般单独写在
model文件中,而且可以在model文件中利用__main__进行网络测试。 - 创建网络模型,加载数据集,定义损失函数,定义优化器,定义训练次数epoch
- loss需要读取值的话是
loss.item() - 可以在外部定义一个total_train_step变量,不断更新,使得每100步打印记录一下loss,减少输出日志
- 训练完几轮模型通常需要使用测试数据集进行测试,
torch.no_grad(),确保不变更计算梯度 - 在数据加载循环外可以定义一个变量记录在测试集上的总loss,每个batch进行loss加和。
- 依旧可以使用tensorboard进行可视化
- 可以指定几个epoch进行一次测试或者模型保存
- 测试集上的loss其实也不能很好反应模型性能,可以计算例如正确率等指标。
- argmax(0),纵向每一列最大值所在位置
- argmax(1),横向每一行最大值所在位置
(preds == targets).sum()计算相等位置的个数
model.train()和model.eval()其实不是必须的,没有的话依然可以训练和测试网络,针对Dropout、BatchNorm等有效果。
- 搭建神经网络结构,一般单独写在
- 使用GPU进行训练
- 三种变量:网络模型、数据(输入、标注)、损失函数
- 方法1:对于上述三种变量调用
.cuda() - 方法2:
.to(device),除了数据其实都不用重新赋值给变量,直接to(device)就行,但是为了统一还是写成model = model.to(device)比较好。
- 完整的模型验证套路
- 利用已经训练好的模型给他输入验证输出
- 如果模型训练和测试设备一个是cpu一个是gpu,可能需要转换一下,具体会报错提示。
- 如何看开源项目
- 命令行参数形式,可以去掉
required=True改为default=xxx,从而能够运行。
- 命令行参数形式,可以去掉