Keras 2 API 文档 / 模型 API / 保存与序列化 / 完整模型保存与加载

完整模型保存与加载

[源代码]

save 方法

Model.save(filepath, overwrite=True, save_format=None, **kwargs)

将模型保存为 TensorFlow SavedModel 或 HDF5 文件。

有关详细信息,请参阅 序列化和保存指南

参数

  • model:要保存的 TF-Keras 模型实例。
  • filepathstrpathlib.Path 对象。保存模型的路径。
  • overwrite:是否应覆盖目标位置的任何现有模型,或者改为通过交互式提示询问用户。
  • save_format"keras""tf""h5" 之一,指示是否以原生 TF-Keras 格式(.keras)、TensorFlow SavedModel 格式(以下称为“SavedModel”)或旧版 HDF5 格式(.h5)保存模型。在 TF 2.X 中默认为 "tf",在 TF 1.X 中默认为 "h5"

SavedModel 格式参数:include_optimizer:仅适用于 SavedModel 和旧版 HDF5 格式。如果为 False,则不保存优化器状态。默认为 True。signatures:仅适用于 SavedModel 格式。要与 SavedModel 一起保存的签名。有关详细信息,请参阅 tf.saved_model.save 中的 signatures 参数。options:仅适用于 SavedModel 格式。tf.saved_model.SaveOptions 对象,指定 SavedModel 保存选项。save_traces:仅适用于 SavedModel 格式。启用后,SavedModel 将存储每一层的函数跟踪。可以禁用此选项,以便仅存储每一层的配置。默认为 True。禁用此选项将减少序列化时间并减小文件大小,但它要求所有自定义层/模型都实现 get_config() 方法。

示例

model = tf.keras.Sequential([
    tf.keras.layers.Dense(5, input_shape=(3,)),
    tf.keras.layers.Softmax()])
model.save("model.keras")
loaded_model = tf.keras.models.load_model("model.keras")
x = tf.random.uniform((10, 3))
assert np.allclose(model.predict(x), loaded_model.predict(x))

请注意,model.save()tf.keras.models.save_model() 的别名。


[源代码]

save_model 函数

tf_keras.saving.save_model(
    model, filepath, overwrite=True, save_format=None, **kwargs
)

将模型保存为 TensorFlow SavedModel 或 HDF5 文件。

有关详细信息,请参阅 序列化和保存指南

参数

  • model:要保存的 TF-Keras 模型实例。
  • filepathstrpathlib.Path 对象。保存模型的路径。
  • overwrite:是否应覆盖目标位置的任何现有模型,或者改为通过交互式提示询问用户。
  • save_format"keras""tf""h5" 之一,指示是否以原生 TF-Keras 格式(.keras)、TensorFlow SavedModel 格式(以下称为“SavedModel”)或旧版 HDF5 格式(.h5)保存模型。在 TF 2.X 中默认为 "tf",在 TF 1.X 中默认为 "h5"

SavedModel 格式参数:include_optimizer:仅适用于 SavedModel 和旧版 HDF5 格式。如果为 False,则不保存优化器状态。默认为 True。signatures:仅适用于 SavedModel 格式。要与 SavedModel 一起保存的签名。有关详细信息,请参阅 tf.saved_model.save 中的 signatures 参数。options:仅适用于 SavedModel 格式。tf.saved_model.SaveOptions 对象,指定 SavedModel 保存选项。save_traces:仅适用于 SavedModel 格式。启用后,SavedModel 将存储每一层的函数跟踪。可以禁用此选项,以便仅存储每一层的配置。默认为 True。禁用此选项将减少序列化时间并减小文件大小,但它要求所有自定义层/模型都实现 get_config() 方法。

示例

model = tf.keras.Sequential([
    tf.keras.layers.Dense(5, input_shape=(3,)),
    tf.keras.layers.Softmax()])
model.save("model.keras")
loaded_model = tf.keras.saving.load_model("model.keras")
x = tf.random.uniform((10, 3))
assert np.allclose(model.predict(x), loaded_model.predict(x))

请注意,model.save()tf.keras.saving.save_model() 的别名。

SavedModel 或 HDF5 文件包含

  • 模型的配置(架构)
  • 模型的权重
  • 模型优化器状态(如果有)

因此,模型可以在完全相同的状态下重新实例化,而无需任何用于模型定义或训练的代码。

请注意,加载后模型权重可能具有不同的作用域名称。作用域名称包括模型/层名称,例如 "dense_1/kernel:0"。建议您使用层属性来访问特定变量,例如 model.get_layer("dense_1").kernel

SavedModel 序列化格式

使用 save_format="tf",模型和附加到它的所有可跟踪对象(例如层和变量)将保存为 TensorFlow SavedModel。模型配置、权重和优化器包含在 SavedModel 中。此外,对于附加到模型的每个 TF-Keras 层,SavedModel 存储

  • 配置和元数据 - 例如名称、数据类型、可训练状态
  • 跟踪的调用和损失函数,它们存储为 TensorFlow 子图。

跟踪的函数允许 SavedModel 格式保存和加载自定义层,而无需原始类定义。

您可以选择不保存跟踪的函数,方法是禁用 save_traces 选项。这将减少保存模型所需的时间以及输出 SavedModel 占用的磁盘空间。如果您启用此选项,则必须在加载模型时提供所有自定义类定义。请参阅 tf.keras.saving.load_model 中的 custom_objects 参数。


[源代码]

load_model 函数

tf_keras.saving.load_model(
    filepath, custom_objects=None, compile=True, safe_mode=True, **kwargs
)

加载通过 model.save() 保存的模型。

参数

  • filepathstrpathlib.Path 对象,保存的模型文件的路径。
  • custom_objects:可选字典,将名称(字符串)映射到反序列化期间要考虑的自定义类或函数。
  • compile:布尔值,指示是否在加载后编译模型。
  • safe_mode:布尔值,指示是否禁止不安全的 lambda 反序列化。当 safe_mode=False 时,加载对象有可能触发任意代码执行。此参数仅适用于 TF-Keras v3 模型格式。默认为 True。

SavedModel 格式参数:options:仅适用于 SavedModel 格式。可选 tf.saved_model.LoadOptions 对象,指定 SavedModel 加载选项。

返回值

一个 TF-Keras 模型实例。如果原始模型已编译,并且设置了参数 compile=True,则返回的模型将被编译。否则,模型将保持未编译状态。

示例

model = tf.keras.Sequential([
    tf.keras.layers.Dense(5, input_shape=(3,)),
    tf.keras.layers.Softmax()])
model.save("model.keras")
loaded_model = tf.keras.saving.load_model("model.keras")
x = tf.random.uniform((10, 3))
assert np.allclose(model.predict(x), loaded_model.predict(x))

请注意,重新加载后,模型变量可能具有不同的名称值(var.name 属性,例如 "dense_1/kernel:0")。建议您使用层属性来访问特定变量,例如 model.get_layer("dense_1").kernel