pytorch lightning 按照频率/epoch/step保存模型或checkpoint

本文介绍了如何在PyTorchLightning中利用ModelCheckpoint回调函数来自动保存深度神经网络模型的参数,以便在训练过程中或之后恢复。示例展示了如何配置ModelCheckpoint以按步数保存模型,并通过Trainer的resume_from_checkpoint参数恢复训练。例子中使用的数据集是FashionMNIST,模型是一个简单的卷积神经网络。
部署运行你感兴趣的模型镜像

需求

在训练深度神经网络时,如果训练时间较长,我们通常希望在训练过程中定期保存模型的参数,以便稍后从该点恢复训练或进行推理。PyTorch Lightning 提供了 ModelCheckpoint 回调函数来帮助我们自动保存模型参数。
在本文中,我们将探讨如何使用 PyTorch Lightning 训练模型并使用 ModelCheckpoint 自动从训练过程中保存模型的参数。

方法

pytorch lightning 提供了保存 checkpoint API https://lightning.ai/docs/pytorch/stable/api/lightning.pytorch.callbacks.ModelCheckpoint.html#lightning.pytorch.callbacks.ModelCheckpoint
利用 **every_n_train_steps 、train_time_interval 、every_n_epochs **设置保存 checkpoint 的按照步数、时间、epoch数来保存 checkpoints,注意三者互斥,如果要同时实现对应的功能需要创建多个 MODELCHECKPOINT
利用 save_top_k 设置保存所有的模型,因为不是通过 monitor 的形式保存的,所以 save_top_k 只能设置为 -1,0,1,分别表示保存所有的模型,不保存模型和保存最后一个模型

示例

准备数据集和模型

首先,我们需要准备数据集和模型。这里我们使用 PyTorch 的 FashionMNIST 数据集和一个简单的卷积神经网络作为模型。

import torch.nn as nn
import torch.optim as optim
from torchvision.datasets import FashionMNIST
from torchvision import transforms
from torch.utils.data import DataLoader
import pytorch_lightning as pl

class Net(pl.LightningModule):
    def __init__(self, num_classes=10):
        super(Net, self).__init__()
        self.conv1 = nn.Conv2d(1, 32, kernel_size=3, padding=1)
        self.conv2 = nn.Conv2d(32, 64, kernel_size=3, padding=1)
        self.pool = nn.MaxPool2d(kernel_size=2, stride=2)
        self.fc1 = nn.Linear(64 * 7 * 7, 128)
        self.fc2 = nn.Linear(128, num_classes)

    def forward(self, x):
        x = self.pool(nn.functional.relu(self.conv1(x)))
        x = self.pool(nn.functional.relu(self.conv2(x)))
        x = x.view(-1, 64 * 7 * 7)
        x = nn.functional.relu(self.fc1(x))
        x = self.fc2(x)
        return x

    def cross_entropy_loss(self, logits, labels):
        return nn.functional.cross_entropy(logits, labels)

    def training_step(self, batch, batch_idx):
        x, y = batch
        logits = self(x)
        loss = self.cross_entropy_loss(logits, y)
        self.log('train_loss', loss, on_step=True, on_epoch=True, logger=True)
        return loss

    def validation_step(self, batch, batch_idx):
        x, y = batch
        logits = self(x)
        loss = self.cross_entropy_loss(logits, y)
        self.log('val_loss', loss, logger=True)
        return loss

    def configure_optimizers(self):
        optimizer = optim.Adam(self.parameters(), lr=0.01)
        return optimizer

# 准备数据集
transform = transforms.Compose([
    transforms.ToTensor(),
    transforms.Normalize((0.5,), (0.5,)),
])
train_set = FashionMNIST(".", train=True, transform=transform, download=True)
train_loader = DataLoader(train_set, batch_size=64, shuffle=True, num_workers=2)
val_set = FashionMNIST(".", train=False, transform=transform, download=True)
val_loader = DataLoader(val_set, batch_size=64, shuffle=False, num_workers=2)

训练模型

接下来,我们使用 Trainer 类来训练模型。

# 训练模型
trainer = pl.Trainer(
    gpus=1,
    max_epochs=5,
    callbacks=[pl.callbacks.ModelCheckpoint(every_n_train_steps=60, save_top_k=-1)]
)
model = Net(num_classes=10)
trainer.fit(model, train_loader, val_loader)

上面的代码将训练模型 5 个 epoch,并在每训练 60 步(batch)时保存一个 checkpoint。ModelCheckpoint 回调函数的 save_top_k 参数为 -1,表示保存所有 checkpoint。

加载已保存的模型

当我们需要从保存的 checkpoint 恢复模型时,可以使用 Trainer 类的 resume_from_checkpoint 参数:

trainer = pl.Trainer(
    gpus=1,
    max_epochs=5,
    callbacks=[pl.callbacks.ModelCheckpoint(every_n_train_steps=60, save_top_k=-1)],
    resume_from_checkpoint='path/to/checkpoint.ckpt'
)
model = Net(num_classes=10)
trainer.fit(model, train_loader, val_loader)

您可能感兴趣的与本文相关的镜像

PyTorch 2.5

PyTorch 2.5

PyTorch
Cuda

PyTorch 是一个开源的 Python 机器学习库,基于 Torch 库,底层由 C++ 实现,应用于人工智能领域,如计算机视觉和自然语言处理

<think>嗯,用户问的是如何在PyTorch Lightning中设置每2个epoch保存一次模型文件。首先,我需要回忆一下PyTorch Lightning的ModelCheckpoint回调函数。根据之前的引用内容,特别是引用[4]里提到的ModelCheckpoint参数,比如every_n_epochs,可能这个参数控制保存频率。 用户提到每2个epoch保存一次,所以应该设置every_n_epochs=2。但是需要确认这个参数的具体作用。比如,是否在每隔n个epoch保存,比如2、4、6这样的。引用[4]中的例子是设置every_n_epochs=0来保存最新的epoch,所以可能当设置为0时不会定期保存,而是其他条件触发。所以正确的做法是将every_n_epochs设为2。 另外,可能还需要设置其他参数,比如filename中可以包含epoch变量,这样文件名就能显示对应的epoch。例如,filename='model-{epoch:02d}',这样保存的文件名会包含两位数的epoch号,方便识别。 还需要注意是否要保存最佳的模型,如果用户只需要定期保存而不考虑验证指标的话,可能需要将monitor=None,者不设置monitor参数,这样就不会基于验证指标保存最佳模型,而是单纯按频率保存。 总结步骤应该是:创建ModelCheckpoint实例,设置every_n_epochs=2,filename包含epoch,可能还需要设置dirpath指定保存路径。然后将这个回调添加到Trainer的callbacks参数中。 另外,引用[4]中提到save_last=True可以保存最后一个epoch模型,但用户的需求是每两个epoch保存一次,所以可能不需要这个参数,除非用户希望同时保留最后一个epoch模型。这点可能需要提醒用户根据需求选择是否添加。 最后,确保代码示例正确,比如正确导入ModelCheckpoint和Trainer,并且参数设置正确。同时,提醒用户检查保存路径是否存在,避免权限问题。</think>在PyTorch Lightning中,可以通过配置`ModelCheckpoint`回调函数实现每2个epoch保存一次模型文件。以下是具体步骤: ### 1. 设置`every_n_epochs`参数 `ModelCheckpoint`的`every_n_epochs`参数控制保存频率。设置`every_n_epochs=2`即可每隔2个epoch保存一次: ```python from pytorch_lightning.callbacks import ModelCheckpoint checkpoint_callback = ModelCheckpoint( dirpath="./checkpoints", # 保存路径 filename="model-{epoch:02d}", # 文件名格式 every_n_epochs=2, # 关键参数:每隔2个epoch保存一次 save_top_k=-1, # 保存所有符合条件的checkpoint save_last=False # 是否额外保存最后一个epoch模型 ) ``` ### 2. 将回调函数传递给`Trainer` 在初始化`Trainer`时,将上述回调函数加入`callbacks`列表中: ```python from pytorch_lightning import Trainer trainer = Trainer( callbacks=[checkpoint_callback], max_epochs=10 # 总训练epoch数 ) ``` ### 3. 验证保存结果 训练完成后,在`./checkpoints`目录下会生成类似`model-epoch=02.ckpt`的文件,对应第2、4、6等epoch模型[^4]。 --- ### 补充说明 - **保存策略**:若需同时保留最佳模型(根据验证指标),可设置`monitor="val_loss"`和`mode="min"`[^2]。 - **存储优化**:若存储空间有限,可通过`save_top_k=3`仅保留最近3个checkpoint[^4]。 - **手动保存**:也可在`LightningModule`中通过`self.save_checkpoint()`实现手动保存。 ---
评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值