save_checkpoint()函数的使用指南与技巧
save_checkpoint()函数是一种将模型的当前状态保存到硬盘上的方法。在训练期间,我们通常会定期保存模型的状态,以便在训练中断后能够从中断的地方恢复训练而不必从头开始。
使用指南与技巧:
1. 确定保存的文件路径:确定保存模型状态的文件路径非常重要。通常,我们会创建一个名为"checkpoints"的文件夹,并以模型的名称和训练的轮数作为文件名。例如,"checkpoints/model_epoch10.pth"表示在训练的第10轮保存的模型状态。
2. 选择保存的内容:save_checkpoint()函数可以保存多个对象,如模型的状态字典、优化器状态字典、损失函数等。您可以根据自己的需要选择保存的内容。通常,我们只保存模型的状态字典和优化器的状态字典。
3. 确定保存的频率:在训练期间,您需要根据自己的需求确定保存模型状态的频率。一般来说,我们可以在每个训练epoch或每个n个训练batch之后保存一次。这有助于在训练中断后可以从上一次保存的状态处继续训练。
4. 加载模型状态:在恢复训练时,您需要使用load_state_dict()函数将保存的模型状态加载到您的模型中。确保加载的模型状态和保存时的模型一致,以确保正确恢复训练。
下面是一个使用save_checkpoint()函数的例子:
import torch
import torch.nn as nn
import torch.optim as optim
def train(model, criterion, optimizer, train_loader, num_epochs):
for epoch in range(num_epochs):
running_loss = 0.0
for i, (inputs, labels) in enumerate(train_loader):
optimizer.zero_grad()
outputs = model(inputs)
loss = criterion(outputs, labels)
loss.backward()
optimizer.step()
running_loss += loss.item()
if i % 100 == 99: # 每100个batch保存一次
save_checkpoint(model, optimizer, epoch, i+1, running_loss)
running_loss = 0.0
def save_checkpoint(model, optimizer, epoch, batch, loss):
checkpoint = {
'model_state_dict': model.state_dict(),
'optimizer_state_dict': optimizer.state_dict(),
'epoch': epoch,
'batch': batch,
'loss': loss
}
torch.save(checkpoint, f"checkpoints/model_epoch{epoch}_batch{batch}.pth")
def load_checkpoint(model, optimizer, path):
checkpoint = torch.load(path)
model.load_state_dict(checkpoint['model_state_dict'])
optimizer.load_state_dict(checkpoint['optimizer_state_dict'])
epoch = checkpoint['epoch']
batch = checkpoint['batch']
loss = checkpoint['loss']
return epoch, batch, loss
# 用法示例
model = MyModel()
criterion = nn.CrossEntropyLoss()
optimizer = optim.SGD(model.parameters(), lr=0.01)
# 恢复训练
epoch, batch, loss = load_checkpoint(model, optimizer, "checkpoints/model_epoch10_batch999.pth")
train(model, criterion, optimizer, train_loader, num_epochs=10)
在这个例子中,训练函数train()会每经过100个batch就保存一次模型的状态。保存的状态包括模型的状态字典、优化器的状态字典、当前的epoch和batch以及损失值。在恢复训练时,我们可以使用load_checkpoint()函数将保存的状态加载到模型和优化器中,并从上一次保存的状态处继续训练。
希望这个使用指南与技巧能够帮助您正确地使用save_checkpoint()函数,并在需要时能够方便地恢复训练。
