使用python的save_checkpoint()函数在训练过程中保存模型状态
发布时间:2023-12-30 13:27:05
在训练过程中,为了防止意外发生而丢失训练的进度,我们可以使用Python中的save_checkpoint()函数保存模型的状态。该函数可以将模型的参数、优化器的状态以及其他相关信息保存到指定的文件中,以便在需要的时候可以方便地加载和继续训练。
下面是一个保存模型状态的示例代码:
import torch
import torch.nn as nn
import torch.optim as optim
# 定义一个简单的模型
class SimpleModel(nn.Module):
def __init__(self):
super(SimpleModel, self).__init__()
self.fc = nn.Linear(10, 1)
def forward(self, x):
return self.fc(x)
# 创建模型实例
model = SimpleModel()
# 定义损失函数和优化器
criterion = nn.MSELoss()
optimizer = optim.SGD(model.parameters(), lr=0.01)
# 训练过程
for epoch in range(10):
inputs = torch.randn(16, 10)
targets = torch.randn(16, 1)
# 前向传播
outputs = model(inputs)
loss = criterion(outputs, targets)
# 反向传播和优化
optimizer.zero_grad()
loss.backward()
optimizer.step()
# 每隔一定的周期保存模型状态
if (epoch+1) % 2 == 0:
state = {
'epoch': epoch+1,
'state_dict': model.state_dict(),
'optimizer': optimizer.state_dict()
}
filename = f'checkpoint_epoch_{epoch+1}.pth'
torch.save(state, filename)
print(f'Saved checkpoint at epoch {epoch+1}')
print('Training completed')
上面的代码中,我们首先定义了一个简单的模型SimpleModel,它包含一个全连接层。然后我们创建了该模型的一个实例,并定义了损失函数和优化器。
接下来的训练过程中,我们使用了一个简单的循环进行模型的训练。在每个周期的训练结束后,我们使用torch.save()函数保存了一个字典,其中包含了当前的周期数、模型的状态和优化器的状态等信息。这个字典被保存在一个以当前周期数命名的文件中。
通过这种方式,我们可以在训练过程中每隔一定周期保存模型状态,以便在需要的时候可以加载这些状态并从上次保存的地方继续训练。
下面是一个加载模型状态并从上次保存的地方继续训练的示例代码:
import torch
import torch.nn as nn
import torch.optim as optim
# 定义一个简单的模型
class SimpleModel(nn.Module):
def __init__(self):
super(SimpleModel, self).__init__()
self.fc = nn.Linear(10, 1)
def forward(self, x):
return self.fc(x)
# 创建模型实例
model = SimpleModel()
# 定义损失函数和优化器
criterion = nn.MSELoss()
optimizer = optim.SGD(model.parameters(), lr=0.01)
# 加载之前保存的模型状态
checkpoint = torch.load('checkpoint_epoch_10.pth')
model.load_state_dict(checkpoint['state_dict'])
optimizer.load_state_dict(checkpoint['optimizer'])
start_epoch = checkpoint['epoch']
# 从上次保存的地方继续训练
for epoch in range(start_epoch, 20):
inputs = torch.randn(16, 10)
targets = torch.randn(16, 1)
# 前向传播
outputs = model(inputs)
loss = criterion(outputs, targets)
# 反向传播和优化
optimizer.zero_grad()
loss.backward()
optimizer.step()
# 每隔一定的周期保存模型状态
if (epoch+1) % 2 == 0:
state = {
'epoch': epoch+1,
'state_dict': model.state_dict(),
'optimizer': optimizer.state_dict()
}
filename = f'checkpoint_epoch_{epoch+1}.pth'
torch.save(state, filename)
print(f'Saved checkpoint at epoch {epoch+1}')
print('Training completed')
在上面的代码中,我们首先通过torch.load()函数加载之前保存的模型状态,将模型的状态和优化器的状态恢复到之前保存的状态。然后根据保存的最后一个周期,设定循环从下一个周期开始继续训练。
使用save_checkpoint()函数可以有效地保存模型的状态,在训练过程中避免丢失进度,并且在需要的时候可以方便地加载和继续训练。这种方式对于训练大型模型或需要长时间训练的任务特别有用。
