PyTorch模型的保存与加载是怎么样的
发表于:2025-12-01 作者:千家信息网编辑
千家信息网最后更新 2025年12月01日,PyTorch模型的保存与加载是怎么样的,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。torch.save()和torch.load
千家信息网最后更新 2025年12月01日PyTorch模型的保存与加载是怎么样的
PyTorch模型的保存与加载是怎么样的,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。
torch.save()和torch.load():
torch.save()和torch.load()配合使用,分别用来保存一个对象(任何对象,不一定要是PyTorch中的对象)到文件,和从文件中加载一个对象.加载的时候可以指明是否需要数据在CPU和GPU中相互移动.
Module.state_dict()和Module.load_state_dict():
Module.state_dict()返回一个字典,该字典以键值对的方式保存了Module的整个状态.Module.load_state_dict()可以从一个字典中加载参数到这个module和其后代,如果strict是True,那么所加载的字典和该module本身state_dict()方法返回的关键字必须严格确切的匹配上.If strict is True, then the keys of state_dict must exactly match the keys returned by this module's state_dict() function.返回值是一个命名元组:NamedTuple with missing_keys and unexpected_keys fields,分别保存缺失的关键字和未预料到的关键字.如果自己的模型跟预训练模型只有部分层是相同的,那么可以只加载这部分相同的参数,只要设置strict参数为False来忽略那些没有匹配到的keys即可。
# 方式1:# model_path = 'model_name.pth'# model_params_path = 'params_name.pth'# ----保存----# torch.save(model, model_path)# ----加载----# model = torch.load(model_path)# 方式2:#----保存----# torch.save(model.state_dict(), model_params_path) #保存的文件名后缀一般是.pt或.pth#----加载----# model=Model().cuda() #定义模型结构# model.load_state_dict(torch.load(model_params_path)) #加载模型参数
说明:
# 保存/加载整个模型torch.save(model, PATH)model = torch.load(PATH)model.eval()这种保存/加载模型的过程使用了最直观的语法,所用代码量少。这使用Python的pickle保存所有模块。这种方法的缺点是,保存模型的时候,序列化的数据被绑定到了特定的类和确切的目录。这是因为pickle不保存模型类本身,而是保存这个类的路径,并且在加载的时候会使用。因此,当在其他项目里使用或者重构的时候,加载模型的时候会出错。# 保存/加载 state_dict(推荐)torch.save(model.state_dict(), PATH)model = TheModelClass(*args, **kwargs)model.load_state_dict(torch.load(PATH))model.eval()
自己选择要保存的参数,设置checkpoint:
#----保存----torch.save({ 'epoch': epoch + 1,'arch': args.arch,'state_dict': model.state_dict(),'optimizer_state_dict': optimizer.state_dict(), 'loss': loss,'best_prec1': best_prec1,}, 'checkpoint_name.tar' )#----加载----checkpoint = torch.load('checkpoint_name.tar')#按关键字获取保存的参数start_epoch = checkpoint['epoch']best_prec1 = checkpoint['best_prec1']state_dict=checkpoint['state_dict']model=Model()#定义模型结构model.load_state_dict(state_dict)保存多个模型到同一个文件:
#----保存----torch.save({ 'modelA_state_dict': modelA.state_dict(), 'modelB_state_dict': modelB.state_dict(), 'optimizerA_state_dict': optimizerA.state_dict(), 'optimizerB_state_dict': optimizerB.state_dict(), ... }, PATH)#----加载----modelA = TheModelAClass(*args, **kwargs)modelB = TheModelAClass(*args, **kwargs)optimizerA = TheOptimizerAClass(*args, **kwargs)optimizerB = TheOptimizerBClass(*args, **kwargs)checkpoint = torch.load(PATH)modelA.load_state_dict(checkpoint['modelA_state_dict']modelB.load_state_dict(checkpoint['modelB_state_dict']optimizerA.load_state_dict(checkpoint['optimizerA_state_dict']optimizerB.load_state_dict(checkpoint['optimizerB_state_dict']modelA.eval()modelB.eval()# ormodelA.train()modelB.train()# 在这里,保存完模型后加载的时候有时会# 遇到CUDA out of memory的问题,# 我google到的解决方法是加上map_location='cpu'checkpoint = torch.load(PATH,map_location='cpu')加载预训练模型的部分:
resnet152 = models.resnet152(pretrained=True) #加载模型结构和参数pretrained_dict = resnet152.state_dict()"""加载torchvision中的预训练模型和参数后通过state_dict()方法提取参数 也可以直接从官方model_zoo下载: pretrained_dict = model_zoo.load_url(model_urls['resnet152'])"""model_dict = model.state_dict()# 将pretrained_dict里不属于model_dict的键剔除掉pretrained_dict = { k: v for k, v in pretrained_dict.items() if k in model_dict}# 更新现有的model_dictmodel_dict.update(pretrained_dict)# 加载我们真正需要的state_dictmodel.load_state_dict(model_dict)或者写详细一点:
model_dict = model.state_dict()state_dict = { }for k, v in pretrained_dict.items():if k in model_dict.keys():# state_dict.setdefault(k, v)state_dict[k] = velse:print("Missing key(s) in state_dict :{}".format(k))model_dict.update(state_dict)model.load_state_dict(model_dict)关于PyTorch模型的保存与加载是怎么样的问题的解答就分享到这里了,希望以上内容可以对大家有一定的帮助,如果你还有很多疑惑没有解开,可以关注行业资讯频道了解更多相关知识。
模型
参数
时候
方法
关键
关键字
字典
对象
文件
问题
方式
结构
训练
相同
数据
更多
中加
帮助
解答
易行
数据库的安全要保护哪些东西
数据库安全各自的含义是什么
生产安全数据库录入
数据库的安全性及管理
数据库安全策略包含哪些
海淀数据库安全审计系统
建立农村房屋安全信息数据库
易用的数据库客户端支持安全管理
连接数据库失败ssl安全错误
数据库的锁怎样保障安全
铜梁区媒体网络技术活动简介
网吧云服务器代理合同模版
网络安全检测网站
软件开发订单商品id如何确定
oracle数据库 真伪
利川r740服务器价格
西藏互联网养老软件开发专业制作
合肥玄鸟互联网科技有限
软件开发需要遵循法律法规
商店数据库的目标
oracle数据库丢失
普通主机做服务器
软件开发程序下载
服务器探针宝塔版
河北迪润网络技术
万国觉醒新手如何更换服务器
网络安全五禁指的是什么
数据可视化和软件开发的区别
三维建模及数据库建设项目
网络安全学生观后感
深圳网上培训软件开发
中国企业网络安全现状及需求
如何用网络安全攻防
思辰网络技术服务有限公司
东航网络技术部门电话
武汉招聘用什么软件开发
甘肃塔式服务器哪家好
网络安全监管制度
网络安全自动化教程
服务器不带桌面的怎么用