keras开发者⽂档7:序列化和保存(Serializationandsaving)⽂章⽬录
介绍
⼀个keras模型包含多个部件:
竟然近义词⼀种体系结构或配置,它指定模型包含哪些层以及如何连接它们。
⼀系列权重值(“模型状态”)。
优化器(通过编译模型定义)。
⼀组loss和metrics(通过编译模型或调⽤add_loss()或add_metric()定义)。
Keras API使得可以将这些⼀次保存到磁盘,或者仅选择性地保存其中⼀些:王睛
将所有内容以TensorFlow SavedModel格式(或更旧的Keras H5格式)保存到单个存档中。 这是标准做法。
仅保存架构/配置,通常保存为JSON⽂件。
仅保存权重值。 通常在训练模型时使⽤。
让我们看⼀下这些选项中的每⼀个:什么时候使⽤其中⼀个? 它们如何⼯作?
对于 saving & loading 来说最短的答案
如果您只有10秒钟的时间阅读本指南,则需要了解以下内容。
保存⼀个keras模型
model = ... # Get model (Sequential, Functional Model, or Model subclass)
model.save('path/to/location')
加载模型
from tensorflow import keras
model = dels.load_model('path/to/location')
马横
Setup
import numpy as np
import tensorflow as tf
from tensorflow import keras
全模型的saving & loading
您可以将整个模型保存到单个⼯件中。 它将包括:
模型的架构/配置
模型的权重值(在训练过程中获悉)
调⽤了模型的编译信息(如果compile())
优化器及其状态(如果有的话)(这使您可以在离开的位置重新开始训练)
APIs
model.save() or dels.save_model()
dels.load_model()
SavedModel format
Example:
def get_model():
# Create a simple model.
inputs = keras.Input(shape=(32,))
outputs = keras.layers.Den(1)(inputs)
model = keras.Model(inputs, outputs)
西红柿酸奶pile(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 ud to reconstruct the model identically.
reconstructed_model = dels.load_model("my_model")
# Let's check:
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)
手镯的寓意和象征SavedModel如何处理⾃定义对象
保存模型及其层时,SavedModel格式存储类名称,调⽤函数,损失和权重(以及配置(如果已实现))。 调⽤函数定义模型/层的计算图。
以下是从SavedModel格式加载⾃定义图层⽽不覆盖config⽅法时发⽣的情况的⽰例。
class CustomModel(keras.Model):
def __init__(lf, hidden_units):
super(CustomModel, lf).__init__()
lf.den_layers = [keras.layers.Den(u) for u in hidden_units]
def call(lf, inputs):
x = inputs
for layer in lf.den_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 = dels.load_model("my_model")
print("Original model:", model)
print("Loaded model:", loaded)
Keras H5 format
Keras还⽀持保存包含模型的架构,权重值和compile()信息的单个HDF5⽂件。 它是SavedModel的轻量替代⽅案。Example:
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 ud to reconstruct the model identically.
reconstructed_model = dels.load_model("my_h5_model.h5")
# Let's check:
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:
mess
reconstructed_model.fit(test_input, test_target)
Saving the architecture
模型的配置(或体系结构)指定了模型包含的层以及如何连接这些层*。 如果您具有模型的配置,则可以使⽤权重的新初始化状态创建模型,⽽⽆需编译信息。
请注意,这仅适⽤于使⽤功能性API或顺序API⽽⾮⼦类模型定义的模型。
顺序模型或功能性API模型的配置
这些类型的模型是显式的层图:它们的配置始终以结构化形式提供。
APIs
get_config() and from_config()
del_to_json() and del_from_json()
调⽤config = _config()将返回⼀个包含模型配置的Python字典。 然后可以通过Sequential.from_config(config)(对于顺序模型)或Model.from_config(config)(对于功能API模
型)来重建同⼀模型。
层案例
layer = keras.layers.Den(3, activation="relu")
layer_config = _config()
new_layer = keras.layers.Den.from_config(layer_config)
序列模型案例
model = keras.Sequential([keras.Input((32,)), keras.layers.Den(1)])
config = _config()
new_model = keras.Sequential.from_config(config)
功能模型案例
inputs = keras.Input((32,))
outputs = keras.layers.Den(1)(inputs)
model = keras.Model(inputs, outputs)
config = _config()
new_model = keras.Model.from_config(config)
Custom objects
Models and layers
⼦类化模型和层的体系结构在__init__和call⽅法中定义。 它们被认为是Python字节码,⽆法序列化为与JSON兼容的配置-您可以尝试序列化字节码(例如通过pickle),但这是完全不安全的,这意味着您的模型⽆法加载到其他系统上。
为了保存/加载具有⾃定义图层的模型或⼦类模型,您应该覆盖get_config和可选的from_config⽅法。 另外,您应该使⽤注册⾃定义对象,以便Keras知道它。
Custom functions
⾃定义函数(例如,激活丢失或初始化)不需要get_config⽅法。 只要将功能名称注册为⾃定义对象,该功能名称就⾜以加载。Loading the TensorFlow graph only
可以加载Keras⽣成的TensorFlow图。 如果这样做,则⽆需提供任何custom_object。 您可以这样做:
model.save("my_model")
tensorflow_graph = tf.saved_model.load("my_model")
x = np.random.uniform(size=(4, 32)).astype(np.float32)
predicted = tensorflow_graph(x).numpy()
请注意,此⽅法有⼏个缺点:*由于可追溯性,您应该始终有权访问所使⽤的⾃定义对象。 您不想将⽆法重新创建的模型投⼊⽣产。 * tf.saved_model.load返回的对象不是Keras模型。 因此,它不是那么容易使⽤。 例如,您将⽆权访问.predict()或.fit()
即使不⿎励使⽤它,它也可以为您提供帮助,例如,如果您处于困境中,例如,丢失了⾃定义对象的代码或在使⽤
dels.load_model()加载模型时遇到问题。
Defining the config methods
Specifications:
为了与Keras节省架构和模型的API兼容,get_config应该返回⼀个JSON可序列化的字典。
from_config(config)(classmethod)应该返回从配置创建的新图层或模型对象。 默认实现返回cls(** config)。
案例:
class CustomLayer(keras.layers.Layer):
def __init__(lf, a):
lf.var = tf.Variable(a, name="var_a")论文的意义
def call(lf, inputs, training=Fal):
if training:
return inputs * lf.var
el:
return inputs
def get_config(lf):那么重要
return {"a": lf.var.numpy()}
# There's actually no need to define `from_config` here, since returning
# `cls(**config)` is the default behavior.
@classmethod
def from_config(cls, config):
return cls(**config)
layer = CustomLayer(5)
layer.var.assign(2)
rialized_layer = keras.layers.rialize(layer)
new_layer = keras.layers.derialize(
rialized_layer, custom_objects={"CustomLayer": CustomLayer}
)
Registering the custom object
Keras保留所有内置层,模型,优化器和度量标准类的主列表,该列表⽤于查找正确的类以调⽤from_config。 如果找不到该类,则会引发错误(值错误:未知图层)。 有⼏种⽅法可以将⾃定义类注册到此列表中:
1. 在加载函数中设置custom_objects参数。 (请参见上⾯“定义配置⽅法”部分中的⽰例)
2. tf.keras.utils.custom_object_scope or tf.keras.utils.CustomObjectScope
3. tf.ister_keras_rializable
Custom layer and function example