YOLOv8训练好模型后,追加轮数继续训练、或者提前终止训练,缩减训练轮数

一、前言

而且此教程适用的情况是你已经训练好了此模型,想继续追加一些轮数。比如训练进度是120/120,已经完成了,继续追加10轮,或者你原先定的是200轮,希望缩减到150轮,可以使用我说的这个方法。为什么缩减也要改一些东西呢?我直接不训练了不就可以了吗?这是因为没有训练完所有epoch,不会输出P、PR曲线等指标;或者说你不想一直盯着看,希望准确地缩减到某轮数,自动停止。

如果你不需要追加训练,只想缩减训练,那么直接看这个博客即可:YOLOv8断点恢复、减少训练轮数、提前终止。这篇博客是本篇博客的一个子集。如果想追加,那下面这些必须全都做。也就是说,项追加训,必须得先实现删减轮数的功能…

以下内容全在trainer.py中进行。前言这部分讲原理,如果不想看,可以直接看二部分。
1.对一个已经训练好的模型,也就是规定100轮,然后也训练了100轮,做了下实验:

    def resume_training(self, ckpt):
        """Resume YOLO training from given epoch and best fitness."""
        if ckpt is None:
            return
        best_fitness = 0.0
        ...
        start_epoch = ckpt["epoch"] + 1
        print(ckpt)
		...

输出结果:

{'epoch': -1, 'best_fitness': None,...}

说明训练好后,ckpt[“epoch”]会变成-1,然而我找了一下午也没找到入口在哪里,**知道的同学可以告诉我一下吗?谢谢。**解释一下,这里的ckpt是存储在权重文件,也就是xxx.pt中的一个字典。

2.另外,打印save_dir的路径:

def __init__(self, cfg=DEFAULT_CFG, overrides=None, _callbacks=None):

        self.args = get_cfg(cfg, overrides)
        self.resume_epochs = self.args.epochs
        self.check_resume(overrides)
        print(self.args.save_dir)

发现结果是报错,而这个参数在未训练完成时,是"runs/detect/train"。对比情况如下:在这里插入图片描述
这说明训练完后,这个save_dir参数被自动删掉了,而这个参数是指引上一次训练结果输出的位置的。所以,这个参数被删掉也会使得resume时不会读上一次训练的目录,而是新创一个。被删除的原因应该和1一样,是在训练完成后自动被处理的。我也没找到具体代码,但我觉得可能在callback函数里,知道的大佬可以告诉我一下吗?

综上,我们要做的就是把save_dir和ckpt[epoch]这两个参数手动恢复。

二、修改方法

注意添加的代码位置,最好跟我位置一样。
步骤1.在trainer.py的__init__() 构造函数里,先用一个变量接收config的epochs

    def __init__(self, cfg=DEFAULT_CFG, overrides=None, _callbacks=None):
        """
        Initializes the BaseTrainer class.

        Args:
            cfg (str, optional): Path to a configuration file. Defaults to DEFAULT_CFG.
            overrides (dict, optional): Configuration overrides. Defaults to None.
        """
        self.args = get_cfg(cfg, overrides)
        ################修改处################
        self.resume_epochs = self.args.epochs# 添加变量接收config,即你规定的epochs
        ######################################
        self.check_resume(overrides)
		...
		...
		...

步骤2. 在check_resume里,添加上一次训练的输出位置,并且恢复self.epochs

    def check_resume(self, overrides):
        """Check if resume checkpoint exists and update arguments accordingly."""
        resume = self.args.resume
        if resume:
            try:
                ...
                ckpt_args = attempt_load_weights(last).args
                #####################修改处↓#####################
                ckpt_args["save_dir"] = "runs\\detect\\train"# <--- 修改处
                #####################修改处↑####################
                ...
				self.args = get_cfg(ckpt_args)
                ############修改处#####################
                self.args.epochs = self.resume_epochs #重新覆盖self.args.epochs数值 
                #######################################
                self.args.model = str(last)  # reinstate model
            	...
            	...

步骤3. 手动添加上次训练好的模型的终止epoch数-1。比如上次我训练了120轮,结束了,我这里就要写120-1=119。一定要-1哈。 因为我们是手动添加的epoch,所以要注意,这个数加进去之后,我们要多注意,我详细说下:刚才不是说了吗,如果在训练过程中,这个epoch是正常的,所以我们手动设置了ckpt[“epoch”]后,训练过程中,它是会正常变化的。但训练完后,还会变成-1,如果像继续训练,则要继续改。这里要一直注意到这个参数,会比较动态。比如我们从训练完的120轮再追加30轮,训练到150轮后,epoch又变成-1,如果我们再想追加10轮,那么这里要改成150-1=149,然后继续训练。

    def resume_training(self, ckpt):
        """Resume YOLO training from given epoch and best fitness."""
        if ckpt is None:
            return
        best_fitness = 0.0
        ###############################
        if ckpt["epoch"] == -1:  #修改处
        	ckpt["epoch"] = 119 # 修改处
        ################################
        start_epoch = ckpt["epoch"] + 1
        ...

步骤4. 修改你的启动训练参数,比如,120 -> 150

from ultralytics import YOLO
if __name__ == '__main__':

    model = YOLO("runs\\detect\\train\\weights\\last.pt")
    results = model.train(data="C:\\Users\\Administrator\\Desktop\\ultralytics-main\\ultralytics-main\\ultralytics\\datasets\\mask\\data.yaml", epochs=150, batch=4, workers=2, resume=True, device=0)

结束,效果如下,我从训练完的120轮有追加了1轮。
在这里插入图片描述

<think>好的,我现在需要帮助用户解决在YOLOv5中增加训练轮数(epochs)的问题。首先,我得回忆一下用户提供的引用内容,看看里面有没有相关的信息。 根据引用[1],用户提到可以通过修改opt.yaml文件中的epochs数值来增加训练轮数。不过用户也提到自己试过减少epochs,但没试过增加,所以可能需要进一步确认。引用[2]讨论了断点训练继续训练的方法,如果用户想在原有训练基础上增加epochs,可能需要用到断点恢复的功能。引用[3]主要讲的是自定义数据集的训练模型调优,可能和参数调整相关,但直接相关的信息不多。 首先,用户想知道如何增加epochs。根据引用[1],直接修改opt.yaml中的epochs参数是一个方法。不过用户可能不知道具体怎么操作,需要详细步骤。比如,用户需要找到这个配置文件的位置,可能是在data目录下或者通过命令行参数指定。此外,用户可能在训练命令中直接指定epochs参数,比如使用--epochs参数,这可能在引用中没有明确提到,但根据YOLOv5的常见用法,应该是可行的。 另外,引用[2]提到在训练中断后继续训练,这时候可能需要使用--resume参数,并且加载last.pt文件。如果用户已经训练了一定的epochs,但想继续增加,可以结合修改epochs参数和恢复训练来实现。比如,原本设置的是100个epochs,已经训练了50个,现在想增加到150,可以修改epochs为150,然后使用--resume来继续训练剩下的100个epochs。 需要注意的几点是:修改配置文件后是否会被命令行参数覆盖?比如,如果在训练命令中指定了--epochs 100,那么opt.yaml中的epochs参数可能被覆盖。所以应该建议用户检查命令行参数和配置文件中的参数优先级。另外,使用断点训练时,确保last.pt存在,并且路径正确。 用户可能遇到的问题包括:修改了配置文件但epochs没有变化,这时候需要确认命令行参数是否覆盖了配置文件;或者继续训练时出现错误,可能是因为断点文件损坏或路径错误。需要提醒用户检查这些方面。 总结步骤应该是: 1. 直接通过命令行参数--epochs指定更大的数值。 2. 或者修改配置文件中的epochs参数,并确保没有被覆盖。 3. 如果需要继续训练,使用--resume参数加载last.pt,并调整epochs总数。 同时,用户可能需要了解如何监控训练过程,比如查看训练日志,确认epochs是否按预期增加。此外,增加epochs可能导致过拟合,所以应该建议用户监控验证集的损失和指标,确保模型性能在提升。 最后,根据用户提供的引用,需要正确添加引用标识,比如在提到修改opt.yaml时引用[1],在断点训练时引用[2]。</think>### 如何在YOLOv5中增加训练轮数(epochs) #### 方法1:直接通过命令行参数调整 在启动训练命令时,使用 `--epochs` 参数直接指定更大的数值。 **示例**: ```bash python train.py --epochs 300 --data coco128.yaml --weights yolov5s.pt ``` 这会覆盖配置文件中默认的 `epochs` 值[^1]。 --- #### 方法2:修改配置文件 1. 找到YOLOv5的配置文件(通常为 `data/hyps/hyp.scratch.yaml` 或自定义的 `opt.yaml`)。 2. 修改其中的 `epochs` 参数: ```yaml # 示例配置片段 lr0: 0.01 epochs: 300 # 原值为100,修改为目标值 ``` 3. 重新启动训练时,配置会自动生效[^1]。 --- #### 方法3:断点续训时调整(推荐) 若需在已有训练基础上增加轮数: 1. **终止训练**:保留生成的 `last.pt` 和 `opt.yaml`。 2. **修改配置文件**:将 `opt.yaml` 中的 `epochs` 改为更大的值。 3. **恢复训练**: ```bash python train.py --resume runs/train/exp/weights/last.pt ``` 系统会从断点处继续训练,直到达到新设置的 `epochs` 总数[^2]。 --- #### 注意事项 1. **过拟合风险**:大幅增加 `epochs` 可能导致模型过拟合,建议配合早停(EarlyStopping)或学习率调整。 2. **配置优先级**:命令行参数优先级高于配置文件,需确保无冲突。 3. **训练监控**:通过TensorBoard观察损失曲线,判断是否需要继续增加轮数: ```bash tensorboard --logdir runs/train ``` ---
评论 16
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值