【问题记录】YOLOv5继续训练时精度损失问题解决

【问题记录】YOLOv5恢复训练时精度损失问题解决

  • 1. 会产生精度损失的训练过程
    • 1.1 修改部分
    • 1.2 训练结果展示
  • 2. 减少精度损失的训练过程
    • 2.1 修改部分
    • 2.2 训练结果展示

1. 会产生精度损失的训练过程

1.1 修改部分

  • 修改 train.py 中的超参数 epochsresume 的默认值为 default=True.
    【问题记录】YOLOv5继续训练时精度损失问题解决_第1张图片
  • utils/torch_utils.py 中的 smart_resume 函数中添加 ckpt['epoch'] = 299(此处的数值为训练完成的 epochs 数)
    【问题记录】YOLOv5继续训练时精度损失问题解决_第2张图片
  • exp/opt.yaml 中修改 epochs 数后训练。
    【问题记录】YOLOv5继续训练时精度损失问题解决_第3张图片

1.2 训练结果展示

  • 从下面展示的精确度和 lr 的曲线图可以看到,在恢复训练之后精度会出现大幅度降低的现象。
  • 精确度-曲线图
    【问题记录】YOLOv5继续训练时精度损失问题解决_第4张图片
  • lr-曲线图
    【问题记录】YOLOv5继续训练时精度损失问题解决_第5张图片

2. 减少精度损失的训练过程

  • 上面直接修改超参数 resume 恢复训练会出现精度损失,从现象上看是因为继续训练之后的 lr 比断点处的 lr 大很多导致的。针对这个想法,减少精度损失可以从 lr 下手,即在恢复训练时将 lr 修改为断点处的 lr 值。下面展示详细的修改过程。

2.1 修改部分

  • 修改 train.py 中的超参数 epochsresume 的默认值为 default=True.
    【问题记录】YOLOv5继续训练时精度损失问题解决_第6张图片
  • utils/torch_utils.py 中的 smart_resume 函数中添加 ckpt['epoch'] = 299(此处的数值为训练完成的 epochs 数)
    【问题记录】YOLOv5继续训练时精度损失问题解决_第7张图片
  • exp/opt.yaml 中除了修改 epochs 之外修改 lr0lrf 为断点处的值(断点处的 lr 值可在 results.csv 中查看)。
    【问题记录】YOLOv5继续训练时精度损失问题解决_第8张图片
  • 注:若后续需要正常训练,训练完成后及时恢复代码修改。

2.2 训练结果展示

  • 精确度-曲线图
    【问题记录】YOLOv5继续训练时精度损失问题解决_第9张图片

  • lr-曲线图
    【问题记录】YOLOv5继续训练时精度损失问题解决_第10张图片

  • 可以看到精确度和 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 斜率不一致,所以训练完成后接着训练需要根据具体情况进行学习率的调整。

你可能感兴趣的:(问题记录,YOLO,深度学习,人工智能)