当前位置: 首页 > news >正文

【yolo】yolo训练报错,以及解决方案

背景:

刚刚,写了《【yolo】yolo推理报错,以及解决方案》,马上训练就遇到类似的报错。
我对我标注的图像进行了300轮的训练,但是训练完300轮后,报错了。。。

报错信息

300 epochs completed in 0.085 hours.
Traceback (most recent call last):
  File "<frozen runpy>", line 198, in _run_module_as_main
  File "<frozen runpy>", line 88, in _run_code
  File "F:\envs\yolo8\Scripts\yolo.exe\__main__.py", line 7, in <module>
  File "F:\envs\yolo8\Lib\site-packages\ultralytics\cfg\__init__.py", line 567, in entrypoint
    getattr(model, mode)(**overrides)  # default args from model
    ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "F:\envs\yolo8\Lib\site-packages\ultralytics\engine\model.py", line 390, in train
    self.trainer.train()
  File "F:\envs\yolo8\Lib\site-packages\ultralytics\engine\trainer.py", line 208, in train
    self._do_train(world_size)
  File "F:\envs\yolo8\Lib\site-packages\ultralytics\engine\trainer.py", line 468, in _do_train
    self.final_eval()
  File "F:\envs\yolo8\Lib\site-packages\ultralytics\engine\trainer.py", line 615, in final_eval
    strip_optimizer(f)  # strip optimizers
    ^^^^^^^^^^^^^^^^^^
  File "F:\envs\yolo8\Lib\site-packages\ultralytics\utils\torch_utils.py", line 484, in strip_optimizer
    x = torch.load(f, map_location=torch.device("cpu"))
        ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "F:\envs\yolo8\Lib\site-packages\torch\serialization.py", line 1470, in load
    raise pickle.UnpicklingError(_get_wo_message(str(e))) from None
_pickle.UnpicklingError: Weights only load failed. This file can still be loaded, to do so you have two options, do those steps only if you trust the source of the checkpoint.
        (1) In PyTorch 2.6, we changed the default value of the `weights_only` argument in `torch.load` from `False` to `True`. Re-running `torch.load` with `weights_only` set to `False` will likely succeed, but it can result in arbitrary code execution. Do it only if you got the file from a trusted source.
        (2) Alternatively, to load with `weights_only=True` please check the recommended steps in the following error message.
        WeightsUnpickler error: Unsupported global: GLOBAL ultralytics.nn.tasks.DetectionModel was not an allowed global by default. Please use `torch.serialization.add_safe_globals([DetectionModel])` or the `torch.serialization.safe_globals([DetectionModel])` context manager to allowlist this global if you trust this class/function.

Check the documentation of torch.load to learn more about types accepted by default with weights_only https://pytorch.org/docs/stable/generated/torch.load.html.

报错原因分析

问题出在训练完成后加载模型权重时,PyTorch的torch.load函数无法正确加载权重文件。具体原因是PyTorch 2.6及以上版本默认启用了weights_only=True,限制了加载的全局对象类型,而权重文件中包含了一个不被允许的全局对象(ultralytics.nn.tasks.DetectionModel)。
这个原因和推理报错类似

从错误信息来看,问题出在训练完成后加载模型权重时,PyTorch的torch.load函数无法正确加载权重文件。具体原因是PyTorch 2.6及以上版本默认启用了weights_only=True,限制了加载的全局对象类型,而权重文件中包含了一个不被允许的全局对象(ultralytics.nn.tasks.DetectionModel)。


  1. PyTorch的weights_only机制
    PyTorch 2.6及以上版本默认启用了weights_only=True,这是一种安全机制,防止加载不受信任的权重文件时执行任意代码。如果你的权重文件中包含不被允许的全局对象(如自定义类或函数),就会触发此错误。

  2. 权重文件问题
    你的权重文件中可能包含了一些自定义的类或函数(如ultralytics.nn.tasks.DetectionModel),这些对象不被weights_only=True允许加载。


解决方法,详细步骤

以下是具体的操作步骤:

  1. 找到加载权重的代码
    在你的错误日志中,加载权重的代码位于ultralytics/utils/torch_utils.py的第484行:
    x = torch.load(f, map_location=torch.device("cpu"))
    

如果你是新建的虚拟环境,直接安装的pytorch的包,那么源代码会在虚拟环境下:
F:\envs\yolo8\Lib\site-packages\ultralytics/utils/torch_utils.py

  1. 修改加载代码
    将上述代码修改为:
    x = torch.load(f, map_location=torch.device("cpu"), weights_only=False)
    

在这里插入图片描述

  1. 重新运行训练
    保存修改后的代码,并重新运行训练脚本。
    修改后立竿见影,不再报错:
    在这里插入图片描述

注意事项

  • 安全性:将weights_only设置为False或使用add_safe_globals会降低安全性,请确保权重文件来自可信来源。
  • 兼容性:如果降级PyTorch版本,请确保其他依赖库与新版本兼容。
  • 备份:在修改代码或降级PyTorch之前,建议备份当前环境和代码。

相关文章:

  • Linux 线程概念
  • 2025.03.21首板涨停股票分析
  • nt!KeWaitForMultipleObjects函数分析之一个例子ExpWorkerThreadBalanceManager
  • 字节手撕题 小于 n 的最大整数 贪心 回溯 剪枝 全排列
  • 基于springboot的地方美食分享网站(全套)
  • 基于Flux模型的多模态可控图像生成工作流实践
  • 从零开始上手huggingface
  • 综合实验配置
  • 开源链动2+1模式、AI智能名片与S2B2C商城小程序源码在社交电商渠道拓宽中的协同应用研究
  • Linux 账号和权限管理命令选项解释
  • 深度学习——图像相似度评价指标
  • busybox的终端图形化界面菜单
  • 电缆接地电流监测系统,为电力稳定运行保驾护航
  • Linux进程间通信
  • 《Java到Go的平滑转型指南》
  • HTML CSS JS官方文档
  • Camera2 实现重力感应四个方向调试相机预览
  • [学习笔记] VM虚拟机安装Ubuntu系统
  • SpringMVC_day02
  • 【清华大学】AIGC发展研究(3.0版)
  • 中国恒大披露清盘进展:要求债权人提交债权证明表
  • 李成钢出席中国与《数字经济伙伴关系协定》成员部级会议
  • 通用汽车回应进口车业务调整传闻:因经济形势变化重组,致力于在中国持续发展
  • 欠债七十万后,一个乡镇驿站站长的中年心事
  • 中保协发布《保险机构适老服务规范》,全面规范保险机构面向老年人提供服务的统一标准
  • 通化市委书记孙简升任吉林省副省长