首页 > Python资料 博客日记
YOLOv8训练好模型后,追加轮数继续训练、或者提前终止训练,缩减训练轮数
2024-08-05 04:00:05Python资料围观263次
一、前言
而且此教程适用的情况是你已经训练好了此模型,想继续追加一些轮数。比如训练进度是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轮。
标签:
相关文章
最新发布
- 【Python】selenium安装+Microsoft Edge驱动器下载配置流程
- Python 中自动打开网页并点击[自动化脚本],Selenium
- Anaconda基础使用
- 【Python】成功解决 TypeError: ‘<‘ not supported between instances of ‘str’ and ‘int’
- manim边学边做--三维的点和线
- CPython是最常用的Python解释器之一,也是Python官方实现。它是用C语言编写的,旨在提供一个高效且易于使用的Python解释器。
- Anaconda安装配置Jupyter(2024最新版)
- Python中读取Excel最快的几种方法!
- Python某城市美食商家爬虫数据可视化分析和推荐查询系统毕业设计论文开题报告
- 如何使用 Python 批量检测和转换 JSONL 文件编码为 UTF-8
点击排行
- 版本匹配指南:Numpy版本和Python版本的对应关系
- 版本匹配指南:PyTorch版本、torchvision 版本和Python版本的对应关系
- Python 可视化 web 神器:streamlit、Gradio、dash、nicegui;低代码 Python Web 框架:PyWebIO
- 相关性分析——Pearson相关系数+热力图(附data和Python完整代码)
- Python与PyTorch的版本对应
- Anaconda版本和Python版本对应关系(持续更新...)
- Python pyinstaller打包exe最完整教程
- Could not build wheels for llama-cpp-python, which is required to install pyproject.toml-based proj