PyTorch模型的保存与加载是怎么样的
发表于:2025-02-06 作者:千家信息网编辑
千家信息网最后更新 2025年02月06日,PyTorch模型的保存与加载是怎么样的,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。torch.save()和torch.load
千家信息网最后更新 2025年02月06日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安全错误
数据库的锁怎样保障安全
负责服务器安全的是什么岗位
怎么在服务器里使用32k
服务器管理网卡的用处
设计软件开发前景
上海管理软件开发平台
Java软件开发工程师级别
非关系数据库 例子
武汉亿视互联网络科技有限公司
服务器性能提升
数据库找工作
临沂森思软件开发
ps4如何清除游戏数据库
塔式服务器值得购买吗
优提示互联网科技有限公司
浙江通用软件开发卖价
杨浦区网络技术服务代理商
网络安全的攻击形式分为主动攻击
金融数据数据库
云南省医药软件开发员待遇
泗阳小型网络技术参考价格
软件开发时都会遇到哪些问题
青花瓷服务器的散人多吗
软件开发怎么产生抵扣
流媒体服务器的负载均衡
远程服务器配置
广州管理软件开发要多少钱
手机号查qq数据库
网络安全教育的紧迫性论文
网络安全监察管理制度
网络安全认证技术包括