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 注意事项

嗯,这里有几个坑我得提醒你:

  1. 自定义层/损失函数:如果你的模型用了自定义层,加载时需要传入custom_objects参数。比如:load_model('model.keras', custom_objects={'MyLayer': MyLayer})
  2. 文件路径:保存时如果路径不存在,不会自动创建目录。记得先os.makedirs()
  3. 大模型:如果你的模型特别大(比如几百MB),保存和加载会慢一些。这时候可以考虑只保存权重,但那就不是完整模型了
我的经验: 如果你在训练过程中想定期保存,建议用上一节讲的Checkpoint。如果训练结束了,想保存最终版本,就用model.save()。两者分工不同,别搞混了。

好了,这一节就到这里。下一节我们会讲如何只保存模型权重,以及什么时候该用那种方式。你想想看,是不是已经对模型保存有了更清晰的认识?