TensorFlow2 - 保存模型Keras完整版,save,get_config(),save_weights


官网Keras教程-保存模型

保存 Keras 模型:

Keras 模型由多个组件组成:

  1. 架构或配置,它指定模型包含的层及其连接方式。
  2. 一组权重值(即“模型的状态”)。
  3. 优化器(通过编译模型来定义)。
  4. 一组损失和指标(通过编译模型或通过调用 add_loss() 或 add_metric() 来定义)。

您可以通过 Keras API 将这些片段一次性保存到磁盘,或仅选择性地保存其中一些片段:

  1. 将所有内容以 TensorFlow SavedModel 格式(或较早的 Keras H5 格式)保存到单个归档。这是标准做法。
  2. 仅保存架构/配置,通常保存为 JSON 文件。
  3. 仅保存权重值。通常在训练模型时使用。

下面我们来看看每个选项:什么时候选择其中哪个选项?它们是如何工作的?

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 的一些详细内容:

  1. 如果使用 tf.keras.Model,keras.Model.save(output_path) 可能正是您需要的方法:参阅 Keras 保存和序列化
  2. 在训练过程中,如果您只想保存/加载权重,请参阅 训练检查点指南。

详情可以看链接

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 文件不包括以下两方面内容:

  1. 通过 model.add_loss() 和 model.add_metric() 添加的外部损失和指标不会被保存(这与 SavedModel 不同)。

    如果您的模型有此类损失和指标且您想要恢复训练,则您需要在加载模型后自行重新添加这些损失。请注意,这不适用于通过 self.add_loss() 和 self.add_metric()

    在层内创建的损失/指标。只要该层被加载,这些损失和指标就会被保留,因为它们是该层 call 方法的一部分。

  2. 已保存的文件中不包含自定义对象(如自定义层)的计算图。在加载时,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,)
  • 8
    点赞
  • 34
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值