欢迎访问宙启技术站
智能推送

save_checkpoint()函数的使用指南与技巧

发布时间:2023-12-24 01:33:17

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()函数,并在需要时能够方便地恢复训练。