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,则停止训练。

之所以设置阈值patience,是因为训练过程中存在波动,不能完全停止训练。同时每隔固定的训练轮次都会保存模型参数,下次可以接着这里训练,缩小训练的范围。
我这里之所以没有触发早停策略,有以下几个原因:
1. 测试集损失在训练中持续下降或震荡,但未出现连续 patience 轮不改善
2. patience值过大,需要调小