Skip to content

Deserialization fails when inference_metrics or summary_metrics are supplied #497

Open
@vpratz

Description

@vpratz

Adding the metrics to the built summary/inference networks from the approximator does not work for deserialization, as the _metrics property is tracked by Keras and can only be set in __init__ and build. I'm not sure yet what the best solution is here, maybe we could move the de/serialization of the _metric property into the InferenceNetwork/SummaryNetwork class? There might be different/better workarounds though.

Error message (upon model loading):

Traceback (most recent call last):
  File "/home/valentin/Programming/IWR/bf2/debug.py", line 24, in <module>
    approximator = keras.saving.load_model("/tmp/app.keras")
                   ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/home/valentin/Programming/.mamba/envs/bf2/lib/python3.11/site-packages/keras/src/saving/saving_api.py", line 189, in load_model
    return saving_lib.load_model(
           ^^^^^^^^^^^^^^^^^^^^^^
  File "/home/valentin/Programming/.mamba/envs/bf2/lib/python3.11/site-packages/keras/src/saving/saving_lib.py", line 367, in load_model
    return _load_model_from_fileobj(
           ^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/home/valentin/Programming/.mamba/envs/bf2/lib/python3.11/site-packages/keras/src/saving/saving_lib.py", line 444, in _load_model_from_fileobj
    model = _model_from_config(
            ^^^^^^^^^^^^^^^^^^^
  File "/home/valentin/Programming/.mamba/envs/bf2/lib/python3.11/site-packages/keras/src/saving/saving_lib.py", line 433, in _model_from_config
    model = deserialize_keras_object(
            ^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/home/valentin/Programming/.mamba/envs/bf2/lib/python3.11/site-packages/keras/src/saving/serialization_lib.py", line 734, in deserialize_keras_object
    instance.compile_from_config(compile_config)
  File "/home/valentin/Programming/IWR/bf2/bayesflow/approximators/continuous_approximator.py", line 116, in compile_from_config
    self.compile(**deserialize(config))
  File "/home/valentin/Programming/IWR/bf2/bayesflow/approximators/continuous_approximator.py", line 105, in compile
    self.inference_network._metrics = inference_metrics
    ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/home/valentin/Programming/.mamba/envs/bf2/lib/python3.11/site-packages/keras/src/layers/layer.py", line 1470, in __setattr__
    value = self._tracker.track(value)
            ^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/home/valentin/Programming/.mamba/envs/bf2/lib/python3.11/site-packages/keras/src/utils/tracking.py", line 95, in track
    return TrackedList(attr, self)
           ^^^^^^^^^^^^^^^^^^^^^^^
  File "/home/valentin/Programming/.mamba/envs/bf2/lib/python3.11/site-packages/keras/src/utils/tracking.py", line 141, in __init__
    values = [tracker.track(v) for v in values]
             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/home/valentin/Programming/.mamba/envs/bf2/lib/python3.11/site-packages/keras/src/utils/tracking.py", line 141, in <listcomp>
    values = [tracker.track(v) for v in values]
              ^^^^^^^^^^^^^^^^
  File "/home/valentin/Programming/.mamba/envs/bf2/lib/python3.11/site-packages/keras/src/utils/tracking.py", line 81, in track
    self.add_to_store(store_name, attr)
  File "/home/valentin/Programming/.mamba/envs/bf2/lib/python3.11/site-packages/keras/src/utils/tracking.py", line 119, in add_to_store
    raise ValueError(self._lock_violation_msg)
ValueError: You cannot add new elements of state (variables or sub-layers) to a layer that is already built. All state must be created in the `__init__()` method or in the `build()` method.

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions