序列化工具

[原始碼]

serialize_keras_object 函數

keras.saving.serialize_keras_object(obj)

透過序列化 Keras 物件來檢索配置字典。

serialize_keras_object() 將 Keras 物件序列化為代表該物件的 Python 字典,並且是 deserialize_keras_object() 的互逆函數。請參閱 deserialize_keras_object() 以取得關於配置格式的更多資訊。

引數

  • obj:要序列化的 Keras 物件。

傳回

代表該物件的 Python 字典。此 Python 字典可以透過 deserialize_keras_object() 反序列化。


[原始碼]

deserialize_keras_object 函數

keras.saving.deserialize_keras_object(
    config, custom_objects=None, safe_mode=True, **kwargs
)

透過反序列化配置字典來檢索物件。

配置字典是一個 Python 字典,由一組鍵值對組成,並代表一個 Keras 物件,例如 OptimizerLayerMetrics 等。儲存和載入庫使用以下鍵來記錄 Keras 物件的資訊

  • class_name:字串。這是類別的名稱,與原始碼中定義的完全相同,例如 "LossesContainer"。
  • config:字典。庫定義或使用者定義的鍵值對,用於儲存物件的配置,如同透過 object.get_config() 取得。
  • module:字串。Python 模組的路徑。內建的 Keras 類別預期具有前綴 keras
  • registered_name:字串。類別透過 keras.saving.register_keras_serializable(package, name) API 註冊時使用的鍵。此鍵的格式為 '{package}>{name}',其中 packagename 是傳遞給 register_keras_serializable() 的引數。如果未提供 name,則使用類別名稱。如果 registered_name 成功解析為類別(已註冊),則字典中的 class_nameconfig 值將不會被使用。registered_name 僅用於非內建類別。

例如,以下字典代表具有相關配置的內建 Adam 最佳化器

dict_structure = {
    "class_name": "Adam",
    "config": {
        "amsgrad": false,
        "beta_1": 0.8999999761581421,
        "beta_2": 0.9990000128746033,
        "decay": 0.0,
        "epsilon": 1e-07,
        "learning_rate": 0.0010000000474974513,
        "name": "Adam"
    },
    "module": "keras.optimizers",
    "registered_name": None
}
# Returns an `Adam` instance identical to the original one.
deserialize_keras_object(dict_structure)

如果類別沒有匯出的 Keras 命名空間,則庫會透過其 moduleclass_name 追蹤它。例如

dict_structure = {
  "class_name": "MetricsList",
  "config": {
      ...
  },
  "module": "keras.trainers.compile_utils",
  "registered_name": "MetricsList"
}

# Returns a `MetricsList` instance identical to the original one.
deserialize_keras_object(dict_structure)

以下字典代表使用者自訂的 MeanSquaredError 損失

@keras.saving.register_keras_serializable(package='my_package')
class ModifiedMeanSquaredError(keras.losses.MeanSquaredError):
  ...

dict_structure = {
    "class_name": "ModifiedMeanSquaredError",
    "config": {
        "fn": "mean_squared_error",
        "name": "mean_squared_error",
        "reduction": "auto"
    },
    "registered_name": "my_package>ModifiedMeanSquaredError"
}
# Returns the `ModifiedMeanSquaredError` object
deserialize_keras_object(dict_structure)

引數

  • config:描述物件的 Python 字典。
  • custom_objects:Python 字典,包含自訂物件名稱與對應類別或函數之間的映射。
  • safe_mode:布林值,是否禁止不安全的 lambda 反序列化。當 safe_mode=False 時,載入物件有可能觸發任意程式碼執行。此引數僅適用於 Keras v3 模型格式。預設值為 True

傳回

config 字典描述的物件。


[原始碼]

CustomObjectScope 類別

keras.saving.custom_object_scope(custom_objects)

向 Keras 反序列化內部機制公開自訂類別/函數。

with custom_object_scope(objects_dict) 的作用域下,Keras 方法(例如 keras.models.load_model()keras.models.model_from_config())將能夠反序列化已儲存配置所引用的任何自訂物件(例如自訂層或指標)。

範例

考慮一個自訂正規化器 my_regularizer

layer = Dense(3, kernel_regularizer=my_regularizer)
# Config contains a reference to `my_regularizer`
config = layer.get_config()
...
# Later:
with custom_object_scope({'my_regularizer': my_regularizer}):
    layer = Dense.from_config(config)

引數

  • custom_objects{str: object} 配對的字典,其中 str 鍵是物件名稱。

[原始碼]

get_custom_objects 函數

keras.saving.get_custom_objects()

檢索對自訂物件全域字典的即時參考。

使用 custom_object_scope() 設定的自訂物件不會被新增到自訂物件的全域字典中,也不會出現在傳回的字典中。

範例

get_custom_objects().clear()
get_custom_objects()['MyObject'] = MyObject

傳回

將已註冊的類別名稱映射到類別的全域字典。


[原始碼]

register_keras_serializable 函數

keras.saving.register_keras_serializable(package="Custom", name=None)

向 Keras 序列化框架註冊物件。

此裝飾器將裝飾的類別或函數注入到 Keras 自訂物件字典中,以便可以對其進行序列化和反序列化,而無需在使用者提供的自訂物件字典中新增條目。它還注入一個函數,Keras 將呼叫該函數以取得物件的可序列化字串鍵。

請注意,為了進行序列化和反序列化,類別必須實作 get_config() 方法。函數沒有此要求。

物件將以鍵 'package>name' 註冊,其中 name 預設為物件名稱(如果未傳遞)。

範例

# Note that `'my_package'` is used as the `package` argument here, and since
# the `name` argument is not provided, `'MyDense'` is used as the `name`.
@register_keras_serializable('my_package')
class MyDense(keras.layers.Dense):
    pass

assert get_registered_object('my_package>MyDense') == MyDense
assert get_registered_name(MyDense) == 'my_package>MyDense'

引數

  • package:此類別所屬的套件。這用於 key(即 "package>name")以識別類別。請注意,這是傳遞到裝飾器的第一個引數。
  • name:在此套件中用於序列化此類別的名稱。如果未提供或為 None,則將使用類別的名稱(請注意,當裝飾器僅使用一個引數時,情況就是如此,該引數將成為 package)。

傳回

一個裝飾器,用於使用傳遞的名稱註冊裝飾的類別。