6 PyTorch训练过程
6.1 学习率调整
学习率(learning rate)
:控制更新的步伐,注意:学习率不宜设置过大,也不宜设置过小lr初始化:
- 设置较小数:0.01、0.001、0.0001
- 搜索最大学习率:《Cyclical Learning Rates for Training Neural Networks》
lr调整策略:学习率前期需设置大,后期需设置小
PyTorch 中常用的 lr_scheduler [学习率调整策略]
PyTorch API:Doc —> torch.optim —> How to adjust Learning Rate
-
_LRScheduler类
基本属性:- optimizer:关联的优化器
- last_epoch:上一个epoch数,这个变量用于指示学习率是否需要调整。当last_epoch符合设定的间隔时就会调整学习率。当设置为-1时,学习率设置为初始值
- base_lrs:记录初始学习率
主要方法:
- step():更新下一个epoch的学习率
- get_lr():虚函数,计算下一个epoch的学习率
-
optim.lr_scheduler.StepLR()
功能:等间隔调整学习率,调整方式:lr=lr*gamma参数说明:
-
optimizer:关联的优化器
-
step_size:调整间隔数
-
gamma:调整系数
-
last_epoch:上一个epoch数,这个变量用于指示学习率是否需要调整。当last_epoch符合设定的间隔时就会调整学习率。当设置为-1时,学习率设置为初始值
-
-
optim.lr_scheduler.MultiStepLR()
功能:按照给定间隔调整学习率,调整方式: l r = l r ∗ g a m m a lr = lr * gamma lr=lr∗gamma参数说明:
-
optimizer:关联的优化器
-
milestones:自定义设定调整时刻数列表
-
gamma:调整系数
-
last_epoch:上一个epoch数,这个变量用于指示学习率是否需要调整。当last_epoch符合设定的间隔时就会调整学习率。当设置为-1时,学习率设置为初始值
-
-
optim.lr_scheduler.ExponentialLR()
功能:按照指数衰减调整学习率,调整方式: l r = l r ∗ g a m m a e p o c h lr = lr * gamm{a^{epoch}} lr=lr∗gammaepoch参数说明:
- optimizer:关联的优化器
- gamma:指数的底
- last_epoch:上一个epoch数,这个变量用于指示学习率是否需要调整。当last_epoch符合设定的间隔时就会调整学习率。当设置为-1时,学习率设置为初始值
-
optim.lr_scheduler.ConsineAnnealingLR()
功能:按照余弦周期调整学习率,调整方式: η t = η min + 1 2 ( η max − η min ) ( 1 + cos ( T c u r T max π ) ) {\eta _t} = {\eta _{\min }} + \frac{1}{2}\left( {{\eta _{\max }} - {\eta _{\min }}} \right)\left( {1 + \cos \left( {\frac{{{T_{cur}}}}{{{T_{\max }}}}\pi } \right)} \right) ηt=ηmin+21(ηmax−ηmin)(1+cos(TmaxTcurπ))参数说明:
- optimizer:关联的优化器
- T_max:下降周期
- eta_min:学习率下限
- last_epoch:上一个epoch数,这个变量用于指示学习率是否需要调整。当last_epoch符合设定的间隔时就会调整学习率。当设置为-1时,学习率设置为初始值
-
optim.lr_scheduler.ReduceLROnPlateau()
功能:监控指标,当指标不再变化则自适应调整【比较实用】参数说明:
- optimizer:关联的优化器
- mode:min/max两种模式,min模式:监控loss,max模式:监控分类准确率accuracy
- factor:调整系数
- patience:“耐心”,接受连续几次不变化,则调整学习率
- verbose:是否打印日志
- cooldown:“冷却时间”,停止监控一段时间
- min_lr:学习率下限
- eps:学习率衰减最小值
-
optim.lr_scheduler.LambdaLR()
功能:自定义调整策略【比较实用,灵活度高】参数说明:
- optimizer:关联的优化器
- lr_lambda:function or list
- last_epoch:上一个epoch数,这个变量用于指示学习率是否需要调整。当last_epoch符合设定的间隔时就会调整学习率。当设置为-1时,学习率设置为初始值
6.2 TensorBoard可视化
TensorBoard
:TensorFlow中强大的可视化工具,支持标量、图像、文本、音频、视频和Embedding等多种数据可视化安装:
- 运行
pip install tensorboard
命令- 若报错ModuleNotFoundError:No module named “past”,则运行pip install future命令
PyTorch中TensorBoard与torchsummary的使用详解
可视化:
- 运行
tensorboard --logdir=./runs
命令- 点击
http://localhost:6006/
出现终端页面可视化
6.2.1 曲线可视化
-
SummaryWriter类
功能:提供创建event file的高级接口基本属性:
- log_dir:event file输出文件夹,默认会在当前文件夹下创建一个
runs文件夹
,通常需设置此属性,方便管理 - comment:不指定log_dir时,文件夹后缀
- filename_suffix:event file文件名后缀
调用方法:from torch.utils.tensorboard import SummaryWriter
创建接口:writer = SummaryWriter(comment=‘test_comment’, filename_suffix=“test_suffix”)
- log_dir:event file输出文件夹,默认会在当前文件夹下创建一个
-
add_scalar()
功能:记录单个曲线的标量参数说明:
- tag:图像的标签名,图的唯一标识
- scalar_value:记录单个曲线的标量,即y轴
- global_step:x轴
-
add_scalars()
功能:记录多个曲线的标量参数说明:
- main_tag:图像的标签名,图的唯一标识
- tag_scalar_dict:字典形式记录多个曲线,其key是变量的tag,value是变量的值
- global_step:x轴
-
add_histogram()
功能:统计直方图与多分位数折线图参数说明:
- tag:图像的标签名,图的唯一标识
- values:统计的参数
- global_step:y轴
- bins:取直方图的bins设置模式,通常默认tensorflow
6.2.2 图像可视化
-
add_image()
功能:记录图像,可实现卷积核与特征图可视化参数说明:
- tag:图像的标签名,图的唯一标识
- img_tensor:图像数据,注意尺度
- global_step:x轴
- dataformats:数据形式,CHW,HWC,HW
-
torchvision.utils.make_grid()
功能:制作网格图像参数说明:
- tensor:图像数据,B*C*H*W形式
- nrow:行数(列数自动计算)
- padding:图像间距(像素单位)
- normalize:是否将像素值标准化
- range:标准化范围
- scale_each:是否单张图维度标准化
- pad_value:padding的像素值
-
add_graph()
功能:可视化模型计算图参数说明:
- model:模型,必须是nn.Module
- input_to_model:输出给模型的数据
- verbose:是否打印计算图结构信息
6.3 torchsummary可视化
torchsummary
:查看模型结构信息(网络层形状和参数等)安装:
- 运行
pip install torchsummary
命令
-
torchsummary.summary()
功能:查看模型结构信息,便于调试参数说明:
- model:pytorch模型
- input_size:模型输入size=(channels, H, W)
- batch_size:batch size
- device:“cuda” or “cpu”
6.4 Hook函数与CAM可视化
6.4.1 Hook函数
Hook函数机制
:不改变主体,实现额外功能对应到在PyTorch中,主体就是forward和backward,而额外功能就是对模型的变量进行操作,如提取特征图,提取非叶子结点(张量)的梯度和修改张量梯度等
Hook出现与PyTorch运算机制有关,PyTorch在每一次运算结束后,会将中间变量释放,以节省内存空间,这些会被释放的变量包括非叶子结点(张量),卷积层的输出特征图等
-
Tensor.register_hook()
功能:对张量Tensor注册一个反向传播hook函数,捕获非叶子结点(张量)的梯度参数说明:仅有一个输入参数
- grad:张量的梯度
-
Module.register_forward_hook()
功能:注册module的前向传播hook函数,获取卷积输出特征图参数说明:
- module:当前网络层
- input:当前网络层输入数据
- output:当前网络层输出数据
-
Module.register_forward_pre_hook()
功能:注册module前向传播前的hook函数参数说明:
- module:当前网络层
- input:当前网络层输入数据
-
Module.register_backward_hook()
功能:注册module的反向传播hook函数参数说明:
- module:当前网络层
- grad_input:当前网络层输入梯度数据
- grad_output:当前网络层输出梯度数据
6.4.2 CAM可视化
CAM
:类激活图,class activation map
Grad-CAM
:CAM改进版,利用梯度作为特征图权重