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 格式。指定 SavedModel 保存选项的 tf.saved_model.SaveOptions 对象。 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 格式。指定 SavedModel 保存选项的 tf.saved_model.SaveOptions 对象。 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 会存储

  • 配置和元数据 – 例如名称、dtype、可训练状态
  • 跟踪的调用和损失函数,它们存储为 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