Keras 3 API 文档 / 模型 API / 保存和序列化 / 模型配置序列化

模型配置序列化

[source]

get_config method

Model.get_config()

返回对象的配置.

对象配置是一个Python字典(可序列化), 包含重新实例化它所需的信息.


[source]

from_config method

Model.from_config(config, custom_objects=None)

创建一个从其配置生成的操作.

此方法是 get_config 的逆操作,能够从配置字典实例化相同的操作.

注意:如果你重写此方法,你可能会收到一个序列化的 dtype 配置,这是一个 dict.你可以按如下方式反序列化它:

if "dtype" in config and isinstance(config["dtype"], dict):
    policy = dtype_policies.deserialize(config["dtype"])

参数: config: 一个 Python 字典,通常是 get_config 的输出.

返回: 一个操作实例.


[source]

clone_model function

keras.models.clone_model(
    model,
    input_tensors=None,
    clone_function=None,
    call_function=None,
    recursive=False,
    **kwargs
)

克隆一个函数式或顺序的Model实例.

模型克隆类似于在新的输入上调用模型, 不同的是它创建新的层(从而创建新的权重),而不是共享现有层的权重.

注意, clone_model不会保留模型中共享对象的唯一性(例如,附加到两个不同层的单个变量将被恢复为两个单独的变量).

参数: model: Model的实例 (可以是函数式模型或顺序模型). input_tensors: 可选的输入张量列表或InputLayer对象 用于构建模型.如果没有提供, 将创建新的Input对象. clone_function: 具有签名fn(layer)的可调用对象 用于克隆目标模型中的每一层(Input实例除外).它接受要克隆的层实例作为参数,并返回要在模型副本中使用的相应层实例.如果未指定,此可调用对象默认为以下序列化/反序列化函数:lambda layer: layer.__class__.from_config(layer.get_config()).通过传递自定义的可调用对象,您可以自定义模型的副本,例如,通过包装某些感兴趣的层(例如,您可能希望将所有LSTM实例替换为等效的Bidirectional(LSTM(...))实例).默认为None. call_function: 具有签名fn(layer, *args, **kwargs)的可调用对象 用于调用每个克隆层和一组输入.它接受层实例、调用参数和关键字参数,并返回调用输出.如果未指定,此可调用对象默认为常规的__call__()方法:def fn(layer, *args, **kwargs): return layer(*args, **kwargs).通过传递自定义的可调用对象,您可以在给定层之前或之后插入新层.注意:此参数只能与函数式模型一起使用. recursive: 布尔值.是否递归克隆原始顺序/函数式模型中遇到的任何顺序或函数式模型.如果为False,则内部模型通过调用clone_function()克隆.如果为True,则内部模型通过调用clone_model()并使用相同的clone_functioncall_functionrecursive参数克隆.请注意,在这种情况下,call_function不会传播到任何顺序模型(因为它不适用于顺序模型).

返回: Model的实例,重现原始模型的行为,基于新的输入张量,使用新实例化的权重.如果自定义的clone_functioncall_function修改了层或层调用,克隆的模型可能与原始模型行为不同.

示例:

# 创建一个测试顺序模型.
model = keras.Sequential([
    keras.layers.Input(shape=(728,)),
    keras.layers.Dense(32, activation='relu'),
    keras.layers.Dense(1, activation='sigmoid'),
])
# 创建测试模型的副本(使用新初始化的权重).
new_model = clone_model(model)

使用clone_function使模型通过在各处设置随机种子来确定性:

def clone_function(layer):
    config = layer.get_config()
    if "seed" in config:
        config["seed"] = 1337
    return layer.__class__.from_config(config)

new_model = clone_model(model)

使用call_function在每个Dense层之后添加一个Dropout层(不重新创建新层):

def call_function(layer, *args, **kwargs):
    out = layer(*args, **kwargs)
    if isinstance(layer, keras.layers.Dense):
        out = keras.layers.Dropout(0.5)(out)
    return out

new_model = clone_model(
    model,
    clone_function=lambda x: x,  # 重用相同的层.
    call_function=call_function,
)

注意,默认情况下,子类模型不能被克隆,因为它们的内部层结构是未知的.要实现与子类模型的clone_model等效功能,只需确保模型类实现了get_config()(和可选的from_config()),并调用:

new_model = model.__class__.from_config(model.get_config())

在子类模型的情况下,不能使用自定义的clone_function.