了解PyTorch模型序列化和反序列化的工具torch.utils.serialization
PyTorch提供了一个工具模块torch.utils.serialization,用于模型的序列化和反序列化。该模块提供了一系列函数,可以将模型保存到磁盘,并在需要时重新加载。
首先,我们看一下torch.utils.serialization模块的一些常用函数:
- torch.save(obj, f, pickle_module=<module 'pickle' from ...>): 该函数用于将对象obj保存到磁盘文件f中。obj可以是模型、张量、字典等PyTorch中的任意对象。pickle_module参数指定了用于序列化的pickle模块,默认为pickle。
- torch.load(f, map_location=None, pickle_module=<module 'pickle' from ...>): 该函数用于从磁盘文件f中加载对象。map_location参数用于指定对象应该加载到哪个设备上,例如'cpu'或'cuda:0'。pickle_module参数指定了用于反序列化的pickle模块,默认为pickle。
下面是一个使用torch.utils.serialization进行模型序列化和反序列化的例子:
import torch
import torch.nn as nn
import torch.optim as optim
import torch.utils.serialization as serialization
# 定义一个简单的模型
class SimpleModel(nn.Module):
def __init__(self):
super(SimpleModel, self).__init__()
self.fc = nn.Linear(10, 10)
self.relu = nn.ReLU()
def forward(self, x):
return self.relu(self.fc(x))
# 创建模型和优化器
model = SimpleModel()
optimizer = optim.SGD(model.parameters(), lr=0.1)
# 将模型和优化器保存到磁盘
serialization.save(model.state_dict(), 'model.pth')
serialization.save(optimizer.state_dict(), 'optimizer.pth')
# 加载模型和优化器
model_state_dict = serialization.load('model.pth')
optimizer_state_dict = serialization.load('optimizer.pth')
# 根据保存的状态字典更新模型和优化器
model.load_state_dict(model_state_dict)
optimizer.load_state_dict(optimizer_state_dict)
在上面的例子中,我们首先定义了一个简单的模型SimpleModel,包含一个线性层和一个ReLU激活函数。然后,我们创建了一个模型和一个SGD优化器。使用serialization.save函数,我们将模型的权重和优化器的状态保存到磁盘文件中。之后,使用serialization.load函数,我们从磁盘文件中加载了模型的权重和优化器的状态字典。最后,使用load_state_dict方法将状态字典更新到模型和优化器中。
这个例子展示了如何使用torch.utils.serialization模块来序列化和反序列化模型,以及如何将保存的状态字典加载到模型和优化器中。这在保存和加载训练过程中得到的模型、优化器状态等信息时非常有用,可以方便地进行模型的恢复和继续训练。
需要注意的是,在使用torch.utils.serialization模块保存和加载模型时,要确保模型的定义和加载时保持一致,否则可能会导致加载失败或出现错误。
