我的疑问:net.module.cpu().state_dict()和net.cpu().state_dict()的区别?我在模型里加了东西,然后源代码本是net.module.cpu().state_dict()这样保存的,结果提示我PatchSampleF没有‘module’属性?

一、保存和加载模型

1.保存模型

pytorch中保存模型的有两种方式:
1、保存整个模型:即包括神经网络的的结构信息和模型参数信息,save的对象是网络net。后缀一般命名为.pkl。

2、保存模型参数:即仅保存模型的可训练参数信息,save的对象是网络参数字典net.state_dict()。后缀一般命名为 .pt 或者 .pth。

torch.save(net.cpu().module.state_dict(), model_path)

在训练前,调用model.train()方法使得dropout和BN生效;
在进行预测前,必须调用 model.eval() 方法来将 dropout 和 batch normalization 层设置为验证模型。否则,只会生成前后不一致的预测结果

2.加载模型

1、加载整个模型:通过torch.load(’.pkl’)直接初始化新的神经网络对象

net = Net()
# 保存和加载整个模型
torch.save(net, '.pkl')
model = torch.load('.pkl)

2、加载模型参数:首先实例化网络对象net,再通过net.load_state_dict(torch.load(’.pth’))完成模型参数的加载

# 保存和加载模型参数
```python
net = Net()
torch.save(net.state_dict(), '.pt')
net.load_state_dict(torch.load('.pt))

上面两种方式:都是需要为预测保存模型的时候,即你已经把模型train完了,需要保存下来以备预测使用

二、CPU/GPU保存和加载模型

1、在GPU上训练,CPU保存训练过程中的模型参数,后继续在GPU上训练

torch.save(net.cpu().module.state_dict(), model_path)
net = net.to(device)

注意:net.cpu()方法会产生Moves all model parameters and buffers to the CPU。如果是在训练过程中保存的模型参数,且训练设备是GPU,那在进入到下一个周期训练之前,必须要重新把net部署到GPU设备上,才能正常在GPU上进行训练。否则模型报错。

2、在GPU上 训练,CPU保存模型参数,后在GPU上进行测试

net = Net()
net.load_state_dict(torch.load(model_path))
device = torch.device("cuda:0")
net.to(device)

3、在GPU上训练,CPU上保存模型参数,后在CPU上进行测试

device = torch.device('cpu')
model = Model(*args, **kwargs)
model.load_state_dict(torch.load(PATH, map_location=device))

其他训练和测试方式基本与上面处理差不多,对于训练和测试设备不同的,就要使用map_ocation参数来指定将张量都重新映射到什么设备上。

Logo

旨在为数千万中国开发者提供一个无缝且高效的云端环境,以支持学习、使用和贡献开源项目。

更多推荐