14-模型保存与加载:参数、优化器状态与完整训练恢复

发布时间:2026/8/4 3:22:31
14-模型保存与加载:参数、优化器状态与完整训练恢复 概述训练模型可能花几分钟也可能花几天。训练结果如果只存在内存里程序一结束就丢了。Paddle 中常用paddle.save()和paddle.load()保存、加载模型相关状态。常见保存对象包括模型参数model.state_dict()。优化器状态optimizer.state_dict()。当前 epoch、best accuracy、训练配置等元信息。对应场景场景保存内容只做推理模型参数继续训练模型参数 优化器状态 epoch保存最佳模型验证集指标最好的模型参数完整恢复实验参数、优化器、指标、配置读完本文你应该能保存和加载 Paddle 模型参数保存最佳模型并用 checkpoint 完整恢复训练。state_dict模型参数的字典每个nn.Layer都可以通过state_dict()获取参数状态statemodel.state_dict()它本质上是一个字典key 是参数名value 是 Tensor。示例forname,tensorinmodel.state_dict().items():print(name,tensor.shape)你会看到类似net.0.weight [2, 16] net.0.bias [16] net.2.weight [16, 2] net.2.bias [2]state_dict保存的是参数数值不保存模型类定义。因此加载时需要先创建同样结构的模型。保存模型参数保存paddle.save(model.state_dict(),model.pdparams)加载modelClassifier()state_dictpaddle.load(model.pdparams)model.set_state_dict(state_dict)model.eval()推理withpaddle.no_grad():logitsmodel(x)注意模型结构必须和保存时一致。如果层名、参数 shape 不一致加载会失败或行为不符合预期。保存最佳模型训练过程中常根据验证集指标保存最佳模型best_val_acc0.0forepochinrange(num_epochs):train_loss,train_acctrain_one_epoch(model,train_loader,optimizer)val_loss,val_accevaluate(model,val_loader)ifval_accbest_val_acc:best_val_accval_acc paddle.save(model.state_dict(),best_model.pdparams)print(epoch,val_acc,best_val_acc)这样最终得到的是验证集表现最好的模型而不一定是最后一个 epoch 的模型。为什么不总保存最后一轮后期可能过拟合。验证集指标可能先升后降。最佳模型可能出现在中间 epoch。加载最佳模型并测试训练结束后best_modelClassifier()best_model.set_state_dict(paddle.load(best_model.pdparams))best_model.eval()test_loss,test_accevaluate(best_model,test_loader)print(test_acc:,test_acc)测试集评估应该在模型选择结束后进行。不要用测试集决定是否保存最佳模型最佳模型应由验证集选择。保存优化器状态如果要中断后继续训练仅保存模型参数不够。Adam、Momentum 等优化器内部有动量、二阶矩估计等状态。保存优化器状态paddle.save(optimizer.state_dict(),optimizer.pdopt)加载optimizer.set_state_dict(paddle.load(optimizer.pdopt))注意加载顺序先创建模型 再创建优化器并传入 model.parameters() 再加载模型参数 再加载优化器状态完整 checkpoint恢复训练现场更推荐保存一个完整 checkpointcheckpoint{epoch:epoch,model:model.state_dict(),optimizer:optimizer.state_dict(),best_val_acc:best_val_acc,}paddle.save(checkpoint,checkpoint.pdckpt)加载checkpointpaddle.load(checkpoint.pdckpt)modelClassifier()optimizerpaddle.optimizer.Adam(learning_rate0.01,parametersmodel.parameters(),)model.set_state_dict(checkpoint[model])optimizer.set_state_dict(checkpoint[optimizer])start_epochcheckpoint[epoch]1best_val_acccheckpoint[best_val_acc]这样可以从中断位置继续训练。完整示例保存最佳模型和 checkpointbest_val_acc0.0num_epochs20forepochinrange(num_epochs):train_loss,train_acctrain_one_epoch(model,train_loader,optimizer)val_loss,val_accevaluate(model,val_loader)ifval_accbest_val_acc:best_val_accval_acc paddle.save(model.state_dict(),best_model.pdparams)checkpoint{epoch:epoch,model:model.state_dict(),optimizer:optimizer.state_dict(),best_val_acc:best_val_acc,}paddle.save(checkpoint,last_checkpoint.pdckpt)print(epoch:,epoch,train_loss:,train_loss,val_acc:,val_acc,best_val_acc:,best_val_acc,)这段代码同时保存best_model.pdparams验证集最好的模型参数。last_checkpoint.pdckpt最近一次完整训练状态。恢复训练示例defresume_training(checkpoint_path):modelClassifier()optimizerpaddle.optimizer.Adam(learning_rate0.01,parametersmodel.parameters(),)checkpointpaddle.load(checkpoint_path)model.set_state_dict(checkpoint[model])optimizer.set_state_dict(checkpoint[optimizer])start_epochcheckpoint[epoch]1best_val_acccheckpoint[best_val_acc]returnmodel,optimizer,start_epoch,best_val_acc继续训练model,optimizer,start_epoch,best_val_accresume_training(last_checkpoint.pdckpt)forepochinrange(start_epoch,30):train_loss,train_acctrain_one_epoch(model,train_loader,optimizer)val_loss,val_accevaluate(model,val_loader)推理保存和训练恢复的区别推理只需要模型结构代码 模型参数继续训练需要模型结构代码 模型参数 优化器状态 当前 epoch 训练配置如果只加载模型参数训练也能继续但 Adam 等优化器内部状态会重新开始训练轨迹可能和原来不一致。常见问题问题一模型结构不一致保存时nn.Linear(2,16)加载时改成nn.Linear(2,32)参数 shape 不匹配无法正确加载。问题二只保存了模型忘记保存优化器如果要完整恢复训练必须保存optimizer.state_dict()。问题三加载后忘记 eval推理前model.eval()并配合withpaddle.no_grad():...问题四覆盖了最佳模型最佳模型和最后 checkpoint 最好分开命名best_model.pdparams last_checkpoint.pdckpt问题五没有保存训练配置建议 checkpoint 中保存关键配置config:{hidden_dim:16,learning_rate:0.01,batch_size:64,}否则以后可能不知道该用什么结构加载。文件命名建议常见后缀文件含义.pdparams模型参数.pdopt优化器状态.pdckpt自定义 checkpoint示例best_model.pdparams last_optimizer.pdopt epoch_010.pdckpt命名不影响 Paddle 读取本质上是你团队的约定。清晰比炫技重要。建议练习把训练恢复跑通训练 5 个 epoch 后保存模型参数。新建同结构模型加载参数并验证 accuracy。保存optimizer.state_dict()。保存完整 checkpoint包括 epoch 和 best_val_acc。从 checkpoint 恢复继续训练到 10 个 epoch。故意修改 hidden_dim观察加载失败信息。总结这一篇讲了 Paddle 模型保存与加载model.state_dict()保存模型参数。model.set_state_dict()加载模型参数。optimizer.state_dict()保存优化器状态。最佳模型应根据验证集指标保存。完整恢复训练需要 checkpoint。推理前应使用model.eval()和paddle.no_grad()。如果只能记住一句话那就是只做推理保存模型参数想完整恢复训练就必须同时保存模型、优化器和训练进度。