PyTorch实战:PyTorch进阶训练技巧
往期推荐学习资料:
1.Pytorch实战笔记_GoAI的博客-CSDN博客
2.Pytorch入门教程_GoAI的博客-CSDN博客
本系列目录:
PyTorch学习笔记(一):PyTorch环境安装
PyTorch学习笔记(二):简介与基础知识
PyTorch学习笔记(三):PyTorch主要组成模块
PyTorch学习笔记(四):PyTorch基础实战
PyTorch学习笔记(五):模型定义、修改、保存
以后继续更新! ! ! !
Task05 PyTorch进阶训练技巧
import torch
import torch.nn as nn
import torch.nn.functional as F
1 自定义损失函数
- 定义为函数:由输出值和目标值计算,回波损耗值
- 以类方式定义:通过继承 nn.Module ,将其当做神经网络的一层来看待
以DiceLoss损失函数为例,定义如下:
DSC = \frac{2|X∩Y|}{|X|+|Y|}DSC=∣X∣+∣Y∣2∣X∩Y∣class DiceLoss(nn.Module):
def __init__(self, weight=None, size_average=True):
super(DiceLoss,self).__init__()
def forward(self, inputs, targets, smooth=1):
inputs = F.sigmoid(inputs)
inputs = inputs.view(-1)
targets = targets.view(-1)
intersection = (inputs * targets).sum()
dice = (2.*intersection + smooth)/(inputs.sum() + targets.sum() + smooth)
return 1 - dice
2 动态调整学习率
- Scheduler:学习率衰减策略,解决学习率选择的问题,用于提高精度
- PyTorch Scheduler策略:
- lr_scheduler.LambdaLR
- lr_scheduler.MultiplicativeLR
- lr_scheduler.StepLR
- lr_scheduler.MultiStepLR
- lr_scheduler.ExponentialLR
- lr_scheduler.CosineAnnealingLR
- lr_scheduler.ReduceLROnPlateau
- lr_scheduler.CyclicLR
- lr_scheduler.OneCycleLR
- lr_scheduler.CosineAnnealingWarmRestarts
- 使用说明:需要将 scheduler.step() 放在 optimizer.step() 后面
- 自定义Scheduler:通过自定义函数对学习率进行修改
3 模型微调
- 概念:找到一个相似的训练模型,调整模型参数,并使用数据进行训练。
- 模型微调过程
- 在源数据集上预训练一个神经网络模型,源模型
- 创建一个新的神经网络模型,即目标模型,该模型复制源模型上的所有模型设计和参数(输出层除外)
- 在目标模型中添加一个输出层,其输出大小为目标数据集中的类别数,并随机初始化改变后的模型参数
- 使用目标数据集训练目标模型
- 使用已有模型结构:通过传入 pretrained 参数,决定是否使用预训练好的权重
- 训练特定层:使用 requires_grad=False 冻结部分网络层,只计算新初始化的层的梯度def set_parameter_requires_grad(model, feature_extracting): if feature_extracting: for param in model.parameters(): param.requires_grad = Falseimport torchvision.models as models# 冻结参数的梯度feature_extract = Truemodel = models.resnet50(pretrained=True)set_parameter_requires_grad(model, feature_extract)# 修改模型num_ftrs = model.fc.in_featuresmodel.fc = nn.Linear(in_features=512, out_features=4, bias=True)model.fcLinear(in_features=512, out_features=4, bias=True)
注:在训练过程中,model仍会回传梯度,但是参数更新只会发生在 fc 层。
4 半精度训练
- 半精度优势:减少显存占用,提高GPU同时加载的数据量
- 设置半精度训练:
- 导入 torch.cuda.amp 的 autocast 包
- 在模型定义中的 forward 函数上,设置 autocast 装饰器
- 在训练过程中,在数据输入模型之后,添加 with autocast()
- 适用范围:适用于数据的size较大的数据集(比如3D图像、视频等)
5 总结
- 自定义损失函数可以通过二种方式:函数方式和类方式,建议全程使用PyTorch提供的张量计算方法。
- 通过使用PyTorch中的scheduler动态调整学习率,也支持自定义scheduler
- 模型微调主要是利用已有的预训练模型,调整其中的参数构建目标模型,在目标数据集上训练模型。
- 半精度训练主要适用于数据的size较大的数据集(比如3D图像、视频等)。
文章出处登录后可见!
已经登录?立即刷新