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 不會保留模型內共享物件的唯一性 (例如,附加到兩個不同層的單個變數將被還原為兩個獨立的變數)。

引數

  • modelModel 的實例 (可以是 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_functioncall_functionrecursive 引數呼叫 clone_model()` 複製內部模型。請注意,在這種情況下,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