【问题记录】YOLOv5恢复训练时精度损失问题解决
1. 会产生精度损失的训练过程
1.1 修改部分
- 修改
train.py
中的超参数epochs
,resume
的默认值为default=True
.
- 在
utils/torch_utils.py
中的smart_resume
函数中添加ckpt['epoch'] = 299
(此处的数值为训练完成的 epochs 数)
- 在
exp/opt.yaml
中修改epochs
数后训练。
1.2 训练结果展示
- 从下面展示的精确度和
lr
的曲线图可以看到,在恢复训练之后精度会出现大幅度降低的现象。 - 精确度-曲线图
- lr-曲线图
2. 减少精度损失的训练过程
- 上面直接修改超参数
resume
恢复训练会出现精度损失,从现象上看是因为继续训练之后的lr
比断点处的lr
大很多导致的。针对这个想法,减少精度损失可以从lr
下手,即在恢复训练时将lr
修改为断点处的lr
值。下面展示详细的修改过程。
2.1 修改部分
- 修改
train.py
中的超参数epochs
,resume
的默认值为default=True
.
- 在
utils/torch_utils.py
中的smart_resume
函数中添加ckpt['epoch'] = 299
(此处的数值为训练完成的 epochs 数)
- 在
exp/opt.yaml
中除了修改epochs
之外修改lr0
和lrf
为断点处的值(断点处的lr
值可在results.csv
中查看)。
- 注:若后续需要正常训练,训练完成后及时恢复代码修改。
2.2 训练结果展示
-
精确度-曲线图
-
lr-曲线图
-
可以看到精确度和
lr
曲线图都衔接了之前的训练结果。 -
此外,由于
yolov5-7.0
默认lr
为线性下降,在train.py
中可见代码如下。if opt.cos_lr: lf = one_cycle(1, hyp['lrf'], epochs) # cosine 1->hyp['lrf'] else: lf = lambda x: (1 - x / epochs) * (1.0 - hyp['lrf']) + hyp['lrf'] # linear scheduler = lr_scheduler.LambdaLR(optimizer, lr_lambda=lf) # plot_lr_scheduler(optimizer, scheduler, epochs)
- 为了保持尽可能一致的学习率,需将
hyp['lrf']
替换为默认的初始lrf
值。 - 在计算线性下降的学习率时,由于完成训练后继续训练的
epochs
数只会比之前的大,且lf = (1 - x / epochs) * (1.0 - hyp['lrf']) + hyp['lrf'] = 0.1 - 0.09 * (x / epochs)
(hyp['lrf']
的初始值为0.01),所以300 epochs
的学习率斜率比400 epochs
的大,导致 lr 斜率不一致,所以训练完成后接着训练需要根据具体情况进行学习率的调整。
- 为了保持尽可能一致的学习率,需将