2、Keras模型保存与加载:使用model.save()保存完整模型,使用load_model()恢复模型
好,咱们接着聊模型保存。上一节我们讲了Checkpoint,那是训练过程中的“快照”。但如果你模型训练完了,想直接一把梭——把整个模型结构、权重、优化器状态全存下来,怎么办?
Keras给了我们一个非常方便的方法:model.save()。我个人习惯在模型训练结束后,直接用这个命令把完整模型存成一个文件。下次要用,一行load_model()就全回来了。
2.1 model.save():一键打包,省心省力
这个API说白了就是“全量备份”。它会把以下内容全部打包进一个文件:
- 模型架构:你定义的那些层、连接方式
- 模型权重:训练好的参数值
- 训练配置:损失函数、优化器、评估指标
- 优化器状态:比如Adam的动量参数,方便你接着训练
代码极其简单,就一行:
# 假设你有一个训练好的模型叫 model
model.save('my_complete_model.keras')
嗯,这里要注意文件后缀。Keras推荐用.keras格式,这是TensorFlow 2.x的原生格式。当然你也可以用.h5,但.keras更现代,兼容性更好。
我的小建议: 我在项目中遇到过用
.h5保存后,换了个TensorFlow版本就加载报错的情况。后来我统一改用.keras格式,再没出过这种问题。所以,能用新格式就别用旧的了。
2.2 load_model():一键恢复,原封不动
恢复模型就更简单了:
from tensorflow.keras.models import load_model
# 恢复完整模型
restored_model = load_model('my_complete_model.keras')
# 直接使用,就像没停过一样
predictions = restored_model.predict(x_test)
你想想看,这有多方便?模型结构、权重、优化器状态,全部自动恢复。你甚至可以直接调用restored_model.fit()继续训练,优化器的状态都还在。
关键点: load_model() 恢复出来的模型,和你保存时的模型是完全一样的对象。你可以对它做任何操作——预测、评估、继续训练,都没问题。
2.3 实战示例:完整流程
我给大家写一个完整的例子,从训练到保存再到恢复:
import tensorflow as tf
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Dense, Flatten
from tensorflow.keras.datasets import mnist
# 1. 准备数据
(x_train, y_train), (x_test, y_test) = mnist.load_data()
x_train, x_test = x_train / 255.0, x_test / 255.0
# 2. 构建模型
model = Sequential([
Flatten(input_shape=(28, 28)),
Dense(128, activation='relu'),
Dense(10, activation='softmax')
])
# 3. 编译模型
model.compile(optimizer='adam',
loss='sparse_categorical_crossentropy',
metrics=['accuracy'])
# 4. 训练模型
model.fit(x_train, y_train, epochs=5, validation_split=0.2)
# 5. 保存完整模型
model.save('mnist_model.keras')
print("模型已保存!")
# 6. 恢复模型
restored_model = load_model('mnist_model.keras')
# 7. 验证恢复的模型
loss, acc = restored_model.evaluate(x_test, y_test)
print(f"恢复模型的准确率: {acc:.4f}")
运行这段代码,你会看到保存和恢复后的模型准确率完全一致。为什么会这样?因为保存的是完整状态,不是只存权重。
2.4 两种保存格式对比
| 特性 | .keras 格式 | .h5 格式 |
|---|---|---|
| 保存内容 | 架构 + 权重 + 优化器状态 | 架构 + 权重 + 优化器状态 |
| 文件大小 | 略小 | 略大 |
| 跨版本兼容性 | 好(推荐) | 一般(可能出问题) |
| 是否支持自定义层 | 需要额外处理 | 需要额外处理 |
避坑指南: 我曾经在项目中用
.h5保存模型,然后升级了TensorFlow版本,结果加载时报错说“无法识别某些配置”。后来我查了半天,发现是格式兼容性问题。从那以后,我所有新项目都只用.keras格式。如果你也在用旧版本TensorFlow,建议先升级到2.6以上。
2.5 什么时候用model.save()?
我个人总结了几种场景:
- 模型部署:训练完直接保存,然后丢给TensorFlow Serving或TFLite
- 模型分享:把完整模型发给同事,对方直接load就能用
- 断点续训:保存完整状态,下次接着训练,优化器状态不丢失
- 模型归档:把最终版本存下来,方便以后复现结果
说白了,只要你想“一次保存,永久使用”,就用model.save()。它是最省心的方式。
2.6 注意事项
嗯,这里有几个坑我得提醒你:
- 自定义层/损失函数:如果你的模型用了自定义层,加载时需要传入
custom_objects参数。比如:load_model('model.keras', custom_objects={'MyLayer': MyLayer}) - 文件路径:保存时如果路径不存在,不会自动创建目录。记得先
os.makedirs() - 大模型:如果你的模型特别大(比如几百MB),保存和加载会慢一些。这时候可以考虑只保存权重,但那就不是完整模型了
我的经验: 如果你在训练过程中想定期保存,建议用上一节讲的Checkpoint。如果训练结束了,想保存最终版本,就用
model.save()。两者分工不同,别搞混了。
好了,这一节就到这里。下一节我们会讲如何只保存模型权重,以及什么时候该用那种方式。你想想看,是不是已经对模型保存有了更清晰的认识?