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

模型配置序列化

[源代码]

get_config 方法

Model.get_config()

返回对象的配置。

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


[源代码]

from_config 方法

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 的输出。

返回值

一个操作实例。


[源代码]

clone_model 函数

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

克隆一个 Functional 或 Sequential Model 实例。

模型克隆类似于在新的输入上调用模型,除了它创建新的层(以及新的权重)而不是共享现有层的权重。

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

参数

  • model: Model 实例(可以是 Functional 模型或 Sequential 模型)。
  • 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)。通过传递自定义可调用对象,您可以在给定层之前或之后插入新层。注意:此参数只能与 Functional 模型一起使用。
  • recursive: 布尔值。是否递归克隆在原始 Sequential/Functional 模型中遇到的任何 Sequential 或 Functional 模型。如果 False,则通过调用 clone_function() 克隆内部模型。如果 True,则通过调用 clone_model() 克隆内部模型,并使用相同的 clone_functioncall_functionrecursive 参数。请注意,在这种情况下,call_function 不会传播到任何 Sequential 模型(因为它不适用于 Sequential 模型)。

返回值

一个 Model 实例,它在新的输入张量之上重现原始模型的行为,并使用新实例化的权重。如果自定义 clone_functioncall_function 修改了层或层调用,则克隆模型的行为可能与原始模型不同。

示例

# Create a test Sequential model.
model = keras.Sequential([
    keras.layers.Input(shape=(728,)),
    keras.layers.Dense(32, activation='relu'),
    keras.layers.Dense(1, activation='sigmoid'),
])
# Create a copy of the test model (with freshly initialized weights).
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, clone_function=clone_function)

使用 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,  # Reuse the same layers.
    call_function=call_function,
)

请注意,默认情况下无法克隆子类模型,因为其内部层结构未知。为了在子类模型的情况下实现与 clone_model 等效的功能,只需确保模型类实现了 get_config()(以及可选的 from_config()),然后调用

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

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