YOLOv8训练时如何在每个epoch执行操作并基于验证损失实现早停
基于验证损失的YOLOv8早停+自定义epoch计算实现方案
不用改YOLOv8核心代码,用官方支持的**自定义回调(Callback)**就能搞定这两个需求——每个epoch执行自定义计算,以及基于验证损失的早停。
步骤1:自定义回调类
写一个继承自ultralytics.engine.callbacks.BaseCallback的类,在里面实现两个逻辑:
- 每个epoch结束后执行你的自定义计算
- 基于验证损失判断是否触发早停
from ultralytics.engine.callbacks import BaseCallback class CustomLossEarlyStopping(BaseCallback): def __init__(self, patience=5, min_delta=0.001): self.patience = patience # 容忍多少个epoch损失不下降 self.min_delta = min_delta # 损失下降的最小阈值,小于这个不算提升 self.best_loss = float('inf') self.counter = 0 def on_epoch_end(self, trainer): # --- 1. 在这里执行每个epoch的自定义计算操作 --- current_epoch = trainer.epoch + 1 # epoch从0开始计数 print(f"=== Epoch {current_epoch} 自定义计算开始 ===") # 你的自定义代码写在这里,比如计算额外指标、保存中间结果、自定义日志等 print(f"=== Epoch {current_epoch} 自定义计算结束 ===") # --- 2. 基于验证损失的早停逻辑 --- # 获取当前epoch的验证总损失(不同YOLOv8版本键名可能微调) current_val_loss = trainer.metrics.get('val/loss') or trainer.metrics.get('val_loss') if current_val_loss is None: print("警告:未获取到验证损失,跳过早停判断") return # 判断损失是否有有效下降 if current_val_loss < self.best_loss - self.min_delta: self.best_loss = current_val_loss self.counter = 0 # 重置计数器 print(f"验证损失下降至 {current_val_loss:.4f},重置早停计数器") else: self.counter += 1 print(f"验证损失未下降,早停计数器:{self.counter}/{self.patience}") # 达到容忍次数,触发早停 if self.counter >= self.patience: print(f"已连续{self.patience}个epoch验证损失未下降,触发早停") trainer.stop() # 终止训练
步骤2:训练时加载自定义回调
在调用YOLOv8的train()方法时,通过callbacks参数传入你的自定义回调实例即可:
from ultralytics import YOLO # 加载模型 model = YOLO('yolov8n.pt') # 初始化自定义回调(可根据需求调整patience和min_delta) early_stop_callback = CustomLossEarlyStopping(patience=3, min_delta=0.0005) # 开始训练,传入回调 results = model.train( data='coco128.yaml', epochs=100, # 设置足够大的总epoch数,由早停控制实际训练轮次 callbacks=[early_stop_callback], # 其他训练参数(如batch_size、lr等)按需添加 )
关键细节说明
- 验证损失键名:如果
'val/loss'获取不到,试试打印trainer.metrics查看所有键值对,找到总验证损失对应的键(比如部分版本是'val/box_loss'+'val/cls_loss'的总和,可自行计算)。 - 自定义计算时机:如果需要在验证前执行操作,可重写
on_val_start方法;需要在训练前执行则重写on_train_start,按需选择钩子方法。 - 早停逻辑扩展:你可以修改判断规则,比如只对比分类损失/框损失,或者结合多个损失指标做综合判断。
内容的提问来源于stack exchange,提问作者Ashish Reddy
相关产品推荐
相关产品推荐

