You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.18 14:36:04