YOLOv8训练时我们可以在每个epoch进行操作吗

问题描述 投票:0回答:1

我想在训练期间的每个时期进行一些计算,但 Ultralytics YOLOv8 不允许这样做,这意味着同时对所有时期进行训练。

我想将每个时期的验证损失与之前的迭代进行比较,以便提前停止。 Ultralytics 提前停止了“耐心”参数,但它使用 mAP 作为比较指标,但没有任何类型的损失(对现有代码进行任何更改似乎很复杂)。所以我想在每个时期进行验证损失比较,以避免过度拟合(这里我有每个时期的验证损失,但我无法控制早期停止,我该怎么做。)

object-detection yolo yolov8 early-stopping ultralytics
1个回答
0
投票

使用 callbacks 在 YOLOv8 训练期间的每个 epoch 执行操作。在这种情况下,您需要定义回调方法'on_fit_epoch_end',它在每个fit epoch(train + val)结束时调用。如果达到相关条件,请使用训练停止标志

trainer.stop = True
停止训练。这是您所描述的任务的一个简单示例:

import pandas as pd
from ultralytics import YOLO

# callback method 'on_fit_epoch_end' is called at the end of each fit epoch (train + val)
def on_fit_epoch_end(trainer):
    # get the results.csv data
    results = pd.read_csv(trainer.csv)
    # get the current epoch number from the trainer
    current_epoch = trainer.epoch
    # get the current validation box loss from the results.csv
    current_loss = results['           val/box_loss'].iloc[current_epoch]
    # get the previous validation box loss from the results.csv
    previous_loss = results['           val/box_loss'].iloc[current_epoch - 1 if current_epoch > 0 else current_epoch]

    print(current_loss, previous_loss)

    # early stop logic
    if current_loss > previous_loss:
        print('stopping')
        # trainer stop flag
        trainer.stop = True

model = YOLO("yolov8n.pt")

# register the custom callback
model.add_callback("on_fit_epoch_end", on_fit_epoch_end)

# train as usual
model.train(data='dataset.yaml', epochs=100)

我还没有找到如何直接从训练器或验证器对象获取损失值,因此我必须使用记录这些数据的 results.csv 文件。

© www.soinside.com 2019 - 2024. All rights reserved.