保存模型的好处众多,涵盖了从开发到部署的整个机器学习生命周期。
- 节省资源:训练模型可能需要大量的时间和计算资源。保存模型可以避免重复训练,从而节省时间和计算资源。
- 快速部署:一旦模型被训练并保存,它可以迅速部署到生产环境中,加速产品上市时间。
- 版本控制:保存不同版本的模型有助于跟踪模型的迭代过程,便于比较和回滚到之前的版本。
- 离线使用:保存的模型可以在没有网络连接的情况下使用,这对于需要在本地设备上运行模型的应用程序非常有用。
- 模型共享:研究人员和开发者可以共享他们的模型,促进合作和知识传播。
- 模型评估:保存的模型可以在不同的数据集上进行评估,帮助验证模型的泛化能力和性能。
- 实验复现:保存模型的状态使得其他研究者可以复现实验结果,增加研究的可验证性。
- 业务连续性:在系统升级或迁移过程中,保存的模型可以确保业务的连续性,减少停机时间。
- 法律合规:在某些行业,如医疗和金融,保存模型可能是必须的,以满足法律和合规要求。
- 模型优化:保存的模型可以用于进一步的优化,如模型压缩、加速等,以适应不同的部署环境。
- 模型监控:在模型部署后,保存的模型可以用于监控和比较,以检测模型性能随时间的变化。
- 用户信任:提供透明的模型保存信息可以增加用户对模型决策的信任。
- 教育和研究:保存的模型可以作为教育材料,帮助学生和研究人员学习模型的工作原理。
- 灾难恢复:在发生系统故障时,保存的模型可以作为备份,快速恢复服务。
- 长期维护:随着时间的推移,保存的模型可以用于维护和更新,以适应新的数据和需求。
加载和保存张量
# 保存张量
import torch
from torch import nn
from torch.nn import functional as F
x = torch.arange(4)
torch.save(x, 'x-file')
将存储在文件中的数据读回内存。
x2 = torch.load('x-file')
x2
tensor([0, 1, 2, 3])
存储一个张量列表,然后把它们读回内存。
y = torch.zeros(4)
torch.save([x, y],'x-files')
x2, y2 = torch.load('x-files')
(x2, y2)
(tensor([0, 1, 2, 3]), tensor([0., 0., 0., 0.]))
可以写入或读取从字符串映射到张量的字典。 当我们要读取或写入模型中的所有权重时,这很方便。
mydict = {'x': x, 'y': y}
torch.save(mydict, 'mydict')
mydict2 = torch.load('mydict')
mydict2
{'x': tensor([0, 1, 2, 3]), 'y': tensor([0., 0., 0., 0.])}
加载和保存模型参数
class MLP(nn.Module):
def __init__(self):
super().__init__()
self.hidden = nn.Linear(20, 256)
self.output = nn.Linear(256, 10)
def forward(self, x):
return self.output(F.relu(self.hidden(x)))
net = MLP()
X = torch.randn(size=(2, 20))
Y = net(X)
将模型的参数存储在一个叫做“mlp.params”的文件中
torch.save(net.state_dict(), 'mlp.params')
为恢复模型,需实例化原始多层感知机模型的一个备份, 直接读取文件中存储的参数作为初始参数。
clone = MLP()
clone.load_state_dict(torch.load('mlp.params'))
clone.eval()
MLP(
(hidden): Linear(in_features=20, out_features=256, bias=True)
(output): Linear(in_features=256, out_features=10, bias=True)
)
由于两个实例具有相同的模型参数,在输入相同的X时, 两个实例的计算结果应该相同。
Y_clone = clone(X)
Y_clone == Y
tensor([[True, True, True, True, True, True, True, True, True, True],
[True, True, True, True, True, True, True, True, True, True]])
保存整个模型
torch.save(net, 'net.pt')
net1 = torch.load('net.pt')
net1.eval()
MLP(
(hidden): Linear(in_features=20, out_features=256, bias=True)
(output): Linear(in_features=256, out_features=10, bias=True)
)
原模型和新加载的模型参数应该是相同的。
net.state_dict()['hidden.weight'].data == net1.state_dict()['hidden.weight'].data
tensor([[True, True, True, ..., True, True, True],
[True, True, True, ..., True, True, True],
[True, True, True, ..., True, True, True],
...,
[True, True, True, ..., True, True, True],
[True, True, True, ..., True, True, True],
[True, True, True, ..., True, True, True]])
欢迎点击我的主页查看更多文章。
本人学习地址https://zh-v2.d2l.ai/
恳请大佬批评指正。