Python训练营-Day37-早停策略和模型权重的保存

1.记录训练集的损失函数可以观察是否过拟合

        # 记录损失值并更新进度条
        if (epoch + 1) % 200 == 0:
            losses.append(loss.item())
            epochs.append(epoch + 1)
            # 更新进度条的描述信息
            pbar.set_postfix({'Loss': f'{loss.item():.4f}'})

2.模型保存和加载

# 保存模型参数
torch.save(model.state_dict(), "model_weights.pth")

# 加载参数(需先定义模型结构)
model = MLP()  # 初始化与训练时相同的模型结构
model.load_state_dict(torch.load("model_weights.pth"))
# model.eval()  # 切换至推理模式(可选)

# 保存整个模型
torch.save(model, "full_model.pth")

# 加载模型(无需提前定义类,但需确保环境一致)
model = torch.load("full_model.pth")
model.eval()  # 切换至推理模式(可选)

3.保存训练状态

# # 保存训练状态
# checkpoint = {
#     "model_state_dict": model.state_dict(),
#     "optimizer_state_dict": optimizer.state_dict(),
#     "epoch": epoch,
#     "loss": best_loss,
# }
# torch.save(checkpoint, "checkpoint.pth")

# # 加载并续训
# model = MLP()
# optimizer = torch.optim.Adam(model.parameters())
# checkpoint = torch.load("checkpoint.pth")

# model.load_state_dict(checkpoint["model_state_dict"])
# optimizer.load_state_dict(checkpoint["optimizer_state_dict"])
# start_epoch = checkpoint["epoch"] + 1  # 从下一轮开始训练
# best_loss = checkpoint["loss"]

# # 继续训练循环
# for epoch in range(start_epoch, num_epochs):
#     train(model, optimizer, ...)

4.早停策略

上述早停策略的具体逻辑如下


- 首先初始一个计数器counter。
- 每 200 轮训练执行一次判断:比较当前损失与历史最佳损失。
  - 若当前损失更低,保存模型参数。
  - 若当前损失更高或相等,计数器加 1。
    - 若计数器达到最大容许的阈值patience,则停止训练。

![image.png](attachment:image.png)

之所以设置阈值patience,是因为训练过程中存在波动,不能完全停止训练。同时每隔固定的训练轮次都会保存模型参数,下次可以接着这里训练,缩小训练的范围。


我这里之所以没有触发早停策略,有以下几个原因:
1. 测试集损失在训练中持续下降或震荡,但未出现连续 patience 轮不改善
2. patience值过大,需要调小

@浙大疏锦行

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值