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"])
参数
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
的实例(可以是 Functional 模型或 Sequential 模型)。Input
对象。fn(layer)
的可调用对象,用于克隆目标模型中的每个层(Input
实例除外)。它接受要克隆的层实例作为参数,并返回要在模型副本中使用的相应层实例。如果未指定,则此可调用对象默认为以下序列化/反序列化函数:lambda layer: layer.__class__.from_config(layer.get_config())
。通过传递自定义可调用对象,您可以自定义模型的副本,例如,通过包装某些感兴趣的层(您可能希望将所有 LSTM
实例替换为等效的 Bidirectional(LSTM(...))
实例,例如)。默认为 None
。fn(layer, *args, **kwargs)
的可调用对象,用于调用每个克隆层和一组输入。它接受层实例、调用参数和关键字参数,并返回调用输出。如果未指定,则此可调用对象默认为常规的 __call__()
方法:def fn(layer, *args, **kwargs): return layer(*args, **kwargs)
。通过传递自定义可调用对象,您可以在给定层之前或之后插入新层。注意:此参数只能与 Functional 模型一起使用。False
,则通过调用 clone_function()
克隆内部模型。如果为 True
,则通过使用相同的 clone_function
、call_function
和 recursive
参数调用 clone_model()
克隆内部模型。请注意,在这种情况下,call_function
将不会传播到任何 Sequential 模型(因为它不适用于 Sequential 模型)。返回
Model
的一个实例,在新的输入张量之上,使用新实例化的权重,再现原始模型的行为。如果自定义 clone_function
或 call_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
。