官网Keras教程-保存模型
保存 Keras 模型:
Keras 模型由多个组件组成:
- 架构或配置,它指定模型包含的层及其连接方式。
- 一组权重值(即“模型的状态”)。
- 优化器(通过编译模型来定义)。
- 一组损失和指标(通过编译模型或通过调用 add_loss() 或 add_metric() 来定义)。
您可以通过 Keras API 将这些片段一次性保存到磁盘,或仅选择性地保存其中一些片段:
- 将所有内容以 TensorFlow SavedModel 格式(或较早的 Keras H5 格式)保存到单个归档。这是标准做法。
- 仅保存架构/配置,通常保存为 JSON 文件。
- 仅保存权重值。通常在训练模型时使用。
下面我们来看看每个选项:什么时候选择其中哪个选项?它们是如何工作的?
model.save(), keras.models.load_model()
model = ... # Get model (Sequential, Functional Model, or Model subclass)
model.save('path/to/location')
将模型加载回来:
from tensorflow import keras
model = keras.models.load_model('path/to/location')
一 保存和加载整个模型
您可以将整个模型保存到单个工件中。它将包括:
模型的架构/配置
模型的权重值(在训练过程中学习)
模型的编译信息(如果调用了 compile())
优化器及其状态(如果有的话,使您可以从上次中断的位置重新开始训练)
API
model.save() 或 tf.keras.models.save_model()
tf.keras.models.load_model()
您可以使用两种格式将整个模型保存到磁盘:TensorFlow SavedModel 格式和较早的 Keras H5 格式。推荐使用 SavedModel 格式。它是使用 model.save() 时的默认格式。
您可以通过以下方式切换到 H5 格式:
将 save_format=‘h5’ 传递给 save()。
将以 .h5 或 .keras 结尾的文件名传递给 save()。
1.1 SavedModel 格式
def get_model():
# Create a simple model.
inputs = keras.Input(shape=(32,))
outputs = keras.layers.Dense(1)(inputs)
model = keras.Model(inputs, outputs)
model.compile(optimizer="adam", loss="mean_squared_error")
return model
model = get_model()
# Train the model.
test_input = np.random.random((128, 32))
test_target = np.random.random((128, 1))
model.fit(test_input, test_target)
# Calling `save('my_model')` creates a SavedModel folder `my_model`.
model.save("my_model")
# It can be used to reconstruct the model identically.同一的,相等,相同的
reconstructed_model = keras.models.load_model("my_model")
# Let's check:
np.testing.assert_allclose(
model.predict(test_input), reconstructed_model.predict(test_input)
)
# The reconstructed model is already compiled and has retained the optimizer
# state, so training can resume:
reconstructed_model.fit(test_input, test_target)
4/4 [==============================] - 0s 1ms/step - loss: 0.3874
WARNING:tensorflow:From /tmpfs/src/tf_docs_env/lib/python3.6/site-packages/tensorflow/python/training/tracking/tracking.py:111: Model.state_updates (from tensorflow.python.keras.engine.training) is deprecated and will be removed in a future version.
Instructions for updating:
This property should not be used in TensorFlow 2.0, as updates are applied automatically.
WARNING:tensorflow:From /tmpfs/src/tf_docs_env/lib/python3.6/site-packages/tensorflow/python/training/tracking/tracking.py:111: Layer.updates (from tensorflow.python.keras.engine.base_layer) is deprecated and will be removed in a future version.
Instructions for updating:
This property should not be used in TensorFlow 2.0, as updates are applied automatically.
INFO:tensorflow:Assets written to: my_model/assets
4/4 [==============================] - 0s 1ms/step - loss: 0.3378
<tensorflow.python.keras.callbacks.History at 0x7f2cec175588>
SavedModel 包含的内容:
-模型文件夹
-pb文件: 模型架构和训练配置(包括优化器、损失和指标)
-variables/ 目录 :权重
调用 model.save(‘my_model’) 会创建一个名为 my_model 的文件夹,其包含以下内容:
assets saved_model.pb variables
模型架构和训练配置(包括优化器、损失和指标)存储在 saved_model.pb 中。
权重保存在 variables/ 目录下。
使用SavedModel 格式
使用 SavedModel 格式
SavedModel 包含一个完整的 TensorFlow 程序——不仅包含权重值,还包含计算。它不需要原始模型构建代码就可以运行,因此,对共享和部署(使用 TFLite、TensorFlow.js、TensorFlow Serving 或 TensorFlow Hub)非常有用。
本文深入探讨有关使用低级别 tf.saved_model API 的一些详细内容:
- 如果使用 tf.keras.Model,keras.Model.save(output_path) 可能正是您需要的方法:参阅 Keras 保存和序列化
- 在训练过程中,如果您只想保存/加载权重,请参阅 训练检查点指南。
详情可以看链接
SavedModel 处理自定义对象的方式
保存模型和模型的层时,SavedModel 格式会存储类名称、调用函数、损失和权重(如果已实现,则还包括配置)。调用函数会定义模型/层的计算图。
如果没有模型/层配置,调用函数会被用来创建一个与原始模型类似的模型,该模型可以被训练、评估和用于推断。
尽管如此,在编写自定义模型或层类时,对 get_config 和 from_config 方法进行定义始终是一种好的做法。这样您就可以稍后根据需要轻松更新计算。有关详细信息,请参阅自定义对象。
以下示例演示了在没有重写配置方法的情况下,从 SavedModel 格式加载自定义层所发生的情况。
class CustomModel(keras.Model):
def __init__(self, hidden_units):
super(CustomModel, self).__init__()
self.dense_layers = [keras.layers.Dense(u) for u in hidden_units]
def call(self, inputs):
x = inputs
for layer in self.dense_layers:
x = layer(x)
return x
model = CustomModel([16, 16, 10])
# Build the model by calling it
input_arr = tf.random.uniform((1, 5))
outputs = model(input_arr)
model.save("my_model")
# Delete the custom-defined model class to ensure that the loader does not have
# access to it.
del CustomModel
loaded = keras.models.load_model("my_model")
np.testing.assert_allclose(loaded(input_arr), outputs)
print("Original model:", model)
print("Loaded model:", loaded)
INFO:tensorflow:Assets written to: my_model/assets
WARNING:tensorflow:No training configuration found in save file, so the model was *not* compiled. Compile it manually.
Original model: <__main__.CustomModel object at 0x7f2cec175fd0>
Loaded model: <tensorflow.python.keras.saving.saved_model.load.CustomModel object at 0x7f2d6ce80a58>
如上例所示,加载器动态地创建了一个与原始模型行为类似的新模型。
1.2 Keras H5 格式
Keras 还支持保存单个 HDF5 文件,其中包含模型的架构、权重值和 compile() 信息。它是 SavedModel 的轻量化替代选择。
model = get_model()
# Train the model.
test_input = np.random.random((128, 32))
test_target = np.random.random((128, 1))
model.fit(test_input, test_target)
# Calling `save('my_model.h5')` creates a h5 file `my_model.h5`.
model.save("my_h5_model.h5")
# It can be used to reconstruct the model identically.
reconstructed_model = keras.models.load_model("my_h5_model.h5")
# Let's check:
np.testing.assert_allclose(
model.predict(test_input), reconstructed_model.predict(test_input)
)
# The reconstructed model is already compiled and has retained the optimizer
# state, so training can resume:
reconstructed_model.fit(test_input, test_target)
H5文件的局限
与 SavedModel 格式相比,H5 文件不包括以下两方面内容:
-
通过 model.add_loss() 和 model.add_metric() 添加的外部损失和指标不会被保存(这与 SavedModel 不同)。
如果您的模型有此类损失和指标且您想要恢复训练,则您需要在加载模型后自行重新添加这些损失。请注意,这不适用于通过 self.add_loss() 和 self.add_metric()
在层内创建的损失/指标。只要该层被加载,这些损失和指标就会被保留,因为它们是该层 call 方法的一部分。
-
已保存的文件中不包含自定义对象(如自定义层)的计算图。在加载时,Keras 需要访问这些对象的 Python
类/函数以重建模型。请参阅自定义对象。
二 保存架构(配置):get_config() ,model_to_json()
什么是架构:层与连接方式
模型的配置(或架构)指定模型包含的层,以及这些层的连接方式*。如果您有模型的配置,则可以使用权重的新初始化状态创建模型,而无需编译信息。
*请注意,这仅适用于使用函数式或序列式 API 定义的模型,不适用于子类化模型。
2.1 序贯模型或函数式 API 模型的配置
这些类型的模型是显式的层计算图:它们的配置始终以结构化形式提供。
API:2种
get_config() 和 from_config()
tf.keras.models.model_to_json() 和 tf.keras.models.model_from_json()
(1) get_config() 和 from_config()
调用 config = model.get_config() 将返回一个包含模型配置的 Python 字典。然后可以通过 Sequential.from_config(config)(针对 Sequential 模型)或 Model.from_config(config)(针对函数式 API 模型)重建同一模型。
相同的工作流也适用于任何可序列化的层。
层 示例:
layer = keras.layers.Dense(3, activation="relu")
layer_config = layer.get_config()
new_layer = keras.layers.Dense.from_config(layer_config)
序贯模型 示例:
model = keras.Sequential([keras.Input((32,)