pytorch 模型的保存和加载

本文介绍在PyTorch中保存与恢复模型的方法。包括官方推荐的仅保存模型参数方式,以及同时保存模型结构与参数的方式。并提供了一个完整的示例,展示了如何保存和加载模型检查点。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

本文转至:https://byjiang.com/2017/06/05/How_To_Save_And_Restore_Model/

在模型完成训练后,我们需要将训练好的模型保存为一个文件供测试使用,或者因为一些原因我们需要继续之前的状态训练之前保存的模型,那么如何在PyTorch中保存和恢复模型呢?


方法一(推荐):

第一种方法也是官方推荐的方法,只保存和恢复模型中的参数。

保存

torch.save(the_model.state_dict(), PATH)

恢复

the_model = TheModelClass(*args, **kwargs)
the_model.load_state_dict(torch.load(PATH))

使用这种方法,我们需要自己导入模型的结构信息。



方法二:

使用这种方法,将会保存模型的参数和结构信息。

保存

torch.save(the_model, PATH)

恢复

the_model = torch.load(PATH)

一个相对完整的例子

saving

torch.save({
            'epoch': epoch + 1,
            'arch': args.arch,
            'state_dict': model.state_dict(),
            'best_prec1': best_prec1,
        }, 'checkpoint.tar' )

loading

if args.resume:
        if os.path.isfile(args.resume):
            print("=> loading checkpoint '{}'".format(args.resume))
            checkpoint = torch.load(args.resume)
            args.start_epoch = checkpoint['epoch']
            best_prec1 = checkpoint['best_prec1']
            model.load_state_dict(checkpoint['state_dict'])
            print("=> loaded checkpoint '{}' (epoch {})"
                  .format(args.evaluate, checkpoint['epoch']))

获取模型中某些层的参数

对于恢复的模型,如果我们想查看某些层的参数,可以:

# 定义一个网络
from collections import OrderedDict
model = nn.Sequential(OrderedDict([
                  ('conv1', nn.Conv2d(1,20,5)),
                  ('relu1', nn.ReLU()),
                  ('conv2', nn.Conv2d(20,64,5)),
                  ('relu2', nn.ReLU())
                ]))
# 打印网络的结构
print(model)

OUT:

Sequential (
  (conv1): Conv2d(1, 20, kernel_size=(5, 5), stride=(1, 1))
  (relu1): ReLU ()
  (conv2): Conv2d(20, 64, kernel_size=(5, 5), stride=(1, 1))
  (relu2): ReLU ()
)

如果我们想获取conv1的weight和bias:

params=model.state_dict() 
for k,v in params.items():
    print(k)    #打印网络中的变量名

print(params['conv1.weight'])   #打印conv1的weight
print(params['conv1.bias'])   #打印conv1的bias

### 如何在 PyTorch保存加载模型的最佳实践 #### 保存整个模型 为了同时保存模型的参数网络结构信息,可以使用 `torch.save` 函数来序列化整个模型对象到磁盘。这方法简单直观,适合小型项目或快速原型开发。 ```python import torch # 假设 'the_model' 是已经训练好的模型实例 PATH = './model.pth' torch.save(the_model, PATH) # 保存模型[^1] ``` 这种方法的优点在于恢复时无需重新定义模型类即可直接加载并使用该模型: ```python # 加载保存模型 loaded_model = torch.load(PATH) loaded_model.eval() # 设置为评估模式 ``` 然而,在实际应用中更推荐的做法是仅保存模型的状态字典 (`state_dict`) 而是完整的模型对象。这种方式更加灵活高效,并且能够更好地处理同版本之间的兼容性问题。 #### 只保存状态字典 (State Dictionary) 对于只保存模型权重而包括其架构的情况,则应采用如下方式操作: ```python torch.save(the_model.state_dict(), PATH) # 仅保存模型参数 ``` 当需要再次部署此模型时,先创建一个新的相同类型的未初始化模型实例,再将其状态字典更新为目标文件中的数据: ```python new_model = TheModelClass(*args, **kwargs) # 创建新的模型实例 new_model.load_state_dict(torch.load(PATH)) # 将之前保存的参数赋给新模型 new_model.eval() ``` 这种做法仅减少了存储空间占用量,还便于迁移学习以及微调预训练过的神经网络。 #### 使用 CUDA 进行加速 如果希望利用 GPU 来加快计算速度,可以在构建模型前设置环境变量 `cudnn.benchmark=True` ,从而让 cuDNN 自动寻找最适合当前硬件配置下的卷积算法实现方案[^2]。 ```python import torch.backends.cudnn as cudnn cudnn.benchmark = True device = torch.device('cuda') if torch.cuda.is_available() else torch.device('cpu') model.to(device) ``` 通过上述措施可有效提升含有大量重复运算任务(如图像分类、目标检测等)的应用程序性能表现。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值