我想在训练期间的每个时期进行一些计算,但 Ultralytics YOLOv8 不允许这样做,这意味着同时对所有时期进行训练。
我想将每个时期的验证损失与之前的迭代进行比较,以便提前停止。 Ultralytics 提前停止了“耐心”参数,但它使用 mAP 作为比较指标,但没有任何类型的损失(对现有代码进行任何更改似乎很复杂)。所以我想在每个时期进行验证损失比较,以避免过度拟合(这里我有每个时期的验证损失,但我无法控制早期停止,我该怎么做。)
使用 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 文件。