目标检测 YOLOv5 - 早停机制(Early Stopping)

目标检测 YOLOv5 - 早停机制(Early Stopping)

flyfish

Early Stopping but when?
YOLOv5:v5的版本没有早停机制,在2021年9月5日后的版本更新了早停机制
EarlyStopper updates #4679(Sep 5, 2021)

参数

patience:训练了多少个epoch,如果模型效果未提升,就让模型提前停止训练。
fitness监控的是增大的数值,例如mAP,如果mAP在连续训练patience次内没有增加就停止训练。

如何使用

方式需要两步

一 声明,初始化patience参数

stopper = EarlyStopping(patience=3)

二 训练过程中判断是否需要早停

stopper(epoch=epoch, fitness=mAP的数值)
下例中使用随机数替代传入的mAP,并编写代码进行测试

import random
class EarlyStopping:
    # YOLOv5 simple early stopper
    def __init__(self, patience=30):
        self.best_fitness = 0.0  # i.e. mAP
        self.best_epoch = 0
        self.patience = patience or float('inf')  # epochs to wait after fitness stops improving to stop
        self.possible_stop = False  # possible stop may occur next epoch

    def __call__(self, epoch, fitness):
        if fitness >= self.best_fitness:  # >= 0 to allow for early zero-fitness stage of training
            self.best_epoch = epoch
            self.best_fitness = fitness
        delta = epoch - self.best_epoch  # epochs without improvement
        print("delta:",delta)
        print("best_fitness:", self.best_fitness)
        self.possible_stop = delta >= (self.patience - 1)  # possible stop may occur next epoch
        stop = delta >= self.patience  # stop training if patience exceeded
        if stop:
            print(f'EarlyStopping patience {self.patience} exceeded, stopping training.')
        return stop

#我们编写如下代码进行测试
stopper = EarlyStopping(patience=3)
epochs=10
start_epoch=0
for epoch in range(start_epoch, epochs):
    random.seed(epoch)
    print("function:",stopper(epoch=epoch, fitness=random.uniform(0.1, 0.5)))
    print("possible_stop:",stopper.possible_stop)

输出结果


# delta: 0
# best_fitness: 0.43776874061001925
# function: False
# possible_stop: False
# delta: 1
# best_fitness: 0.43776874061001925
# function: False
# possible_stop: False

# delta: 0
# best_fitness: 0.4824137087556998
# function: False
# possible_stop: False
# delta: 1
# best_fitness: 0.4824137087556998
# function: False
# possible_stop: False
# delta: 2
# best_fitness: 0.4824137087556998
# function: False
# possible_stop: True

# delta: 3
# best_fitness: 0.4824137087556998
# EarlyStopping patience 3 exceeded, stopping training.
# function: True
# possible_stop: True

改进方法

YOLOv5自带的早停机制只能监控不断增大的数值,如果改进可以这样,改进方式如下
(1)增加参数mode,max表示监控增大的数值,min表示监控减小的数值,既能监控不断增大的数值例如mAP,也可以监控不断减少的数值例如loss
(2)如果再精确设置一个最小改变值的参数diff,变化范围太小我们也认为模型效果未提升,代码就不是if fitness >= self.best_fitness 这种比较,而是相减。
(3)当多个模型比较谁厉害的时候,可以设置baseline,训练了多少个epoch,mAP还没有超过baseline也早早停止,不浪费资源了。

阅读此文章的人还阅读了以下内容
目标检测 YOLOv5 - 卷积层和BN层的融合
目标检测 YOLOv5 - Sample Assignment
目标检测 YOLOv5 - 数据增强
目标检测 YOLOv5 - 学习率
目标检测 YOLOv5 - 多机多卡训练
目标检测 YOLOv5 - 浮点取模
目标检测 YOLOv5 - 在多类别中应用NMS(非极大值抑制)
目标检测 YOLOv5 - loss for objectness and classification
目标检测 YOLOv5 - loss for bounding box regression
目标检测 YOLOv5 - 指标计算
目标检测 YOLOv5 - anchor设置
目标检测 YOLOv5 - SPP模块
目标检测 YOLOv5 - 边框预测(bounding box prediction)
目标检测 YOLOv5 - 自定义网络结构(YOLOv5-ShuffleNetV2)
目标检测 YOLOv5 - 常见的边框(bounding box )坐标表示方法
目标检测 YOLOv5 - 图像大小与loss权重的关系
目标检测 YOLOv5 - 根据配置改变网络的深度和宽度
目标检测 YOLOv5 - 转ncnn移动端部署
目标检测 YOLOv5 - Backbone中的Focus
目标检测 YOLOv5 - 模型训练、推理、导出命令
目标检测 YOLOv5 - 人脸数据集widerface转YOLOv5格式
目标检测 YOLOv5 - 使用的数据集格式
目标检测 YOLOv5 - 中使用COCO数据集
目标检测 YOLOv5 - CrowdHuman数据集格式转YOLOv5格式

版权声明:本文为CSDN博主「TheOldManAndTheSea」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/flyfish1986/article/details/120163286

TheOldManAndTheSea

我还没有学会写个人说明!

暂无评论

发表评论

相关推荐