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

(已解决)torch.load的时候发生错误ModuleNotFoundError: No module named ‘models‘

文章目录

      • 背景
      • 原因
      • 解决方案

背景

很简单,我网上下载了一个模型文件,现在想读取这个模型,然后将这个模型用在我的数据集上。

import torch
model=torch.load("model.pyt")#这步直接报错了。
output=model(mydata)

报错了。

ModuleNotFoundError: No module named ‘models‘

原因

我现在项目的目录结构和model.pyt这个模型文件当初在保存torch.save的时候的项目目录不一致,导致导入load模型的时候有一些关键东西缺失。

啥意思呢?假设当初模型保存torch.save的文件长成这样。

import torch
from A import Model
model=Model()
torch.save(model,"model.pyt")

保存在model.pyt中的东西,大家都知道,有模型权重,模型结构等。但是大家想过这样一个问题没有,如果模型里面的一个函数引用了另外一个用户自定义的函数,在torch.save之后,这个自定义函数会被保存吗?答案是不会被保存。也就是说,对于上面的代码,

import torch
from A import Model

torch这个库不会被保存,A这个文件也不会被保存。那么自然,等我们torch.load的时候,A就会找不到,torch可以找到,因为我们本地肯定会导入torch

为啥Pytorch设计的时候不保存这些呢?很简单,就怕模型里面的一个函数引用了另外一个用户自定义的函数,然后这个自定义函数又引用另外一个,然后没玩没了。更怕的是,自定义函数里面还导入了一些非常大的数据,如果全部保存起来,model.pyt得多么大呀!

解决方案

一种方法当然就是把他的原项目下载下来,这包括了他的代码文件,而不能像我一样只下载模型文件。

其实,在load的时候Pytorch已经提示我们了,虽然只是一个warning。

FutureWarning: You are using torch.load with weights_only=False (the current default value), which uses the default pickle module implicitly. It is possible to construct malicious pickle data which will execute arbitrary code during unpickling (See https://github.com/pytorch/pytorch/blob/main/SECURITY.md#untrusted-models for more details). In a future release, the default value for weights_only will be flipped to True. This limits the functions that could be executed during unpickling. Arbitrary objects will no longer be allowed to be loaded via this mode unless they are explicitly allowlisted by the user via torch.serialization.add_safe_globals. We recommend you start setting weights_only=True for any use case where you don’t have full control of the loaded file. Please open an issue on GitHub for any issues related to this experimental feature.

官方不建议torch.save(model,"model.pyt")这种保存方式,比较推荐torch.save(model.state_dict(),"model.pyt"),也就是只保存模型权重,其他的一律不保存。这样,强制了你去下载代码文件,不然下面第一行代码Model()会报错。

model = Model()
state_dict = torch.load('model.pyt')
model.load_state_dict(state_dict)#载入训练好的权重。

相关文章:

  • 【Gitee自动化测试2】Git,Github,Gitlab,Gitee
  • 已存在的Python项目使用依赖管理工具UV
  • 比较 Python Web 框架:Django、FastAPI 和 Flask
  • 微服务注册中⼼1
  • 【计算机组成原理】实验一:运算器输入锁存器数据写实验
  • MCUboot 和 U-Boot区别
  • 什么是ETL?什么是ELT?怎么区分它们使用场景
  • 常见的TTL,RS232,RS485,IIC,SPI,UART之间的联系和区别
  • 【学习笔记】SSL/TLS证书安全机制之证书透明
  • 包/环境管理工具pip和conda介绍
  • LabVIEW提高开发效率技巧----利用第三方库和工具
  • 嵌入式中CW32多功能测试笔实现
  • 使用宝塔部署项目在win上
  • python库 | lxml库
  • STM32与51单片机的区别:是否应该直接学习STM32?
  • 【机器学习】 Flux.jl 求解 XOR 分类问题的神经网络模型
  • 修改Opcenter EXFN 页面超时时间(Adjust UI Session Extend Token)
  • C++中move和forword的区别
  • 时尚与科技的融合,戴上更轻更悦耳的QCY C30耳夹耳机,随时享受好音乐
  • 《论软件架构建模技术与应用》写作框架,软考高级系统架构设计师
  • 国际足联女子世界杯再次扩军,2031年起增至48支球队
  • 安徽亳州涡阳县司法局党组书记刘兴连落马
  • 国博馆刊|北朝至唐初夏州酋豪李氏家族的发展与身份记忆
  • 盖茨:20年内将捐出几乎全部财富,盖茨基金会2045年关闭
  • 酒店取消订单加价卖何以屡禁不绝?专家建议建立黑名单并在商家页面醒目标注
  • 售卖自制外挂交易额超百万元,一男子因提供入侵计算机系统程序被抓