ageron / handson-ml2

A series of Jupyter notebooks that walk you through the fundamentals of Machine Learning and Deep Learning in Python using Scikit-Learn, Keras and TensorFlow 2.
Apache License 2.0
27.25k stars 12.59k forks source link

[BUG] Chapter 12: Loading model is failed when using the custom regularisers, activation, etc #634

Open vahidNaghshin opened 2 months ago

vahidNaghshin commented 2 months ago

Describe the bug In chapter 12, when working with the custom models, the Keras fails loading the model after saving. It is saved safely (not pure safely as it throws warning indicating the save format should be converted to Keras rather than h5) and after loading it throws an exceptions.

notebook name: 12_custom_models_and_training_with_tensorflow.ipynb cell numbers: 91

To Reproduce Please copy the code that fails here, using code blocks like this:

model = keras.models.load_model( "my_model_with_many_custom_parts.h5", custom_objects={ "my_l1_regularizer": my_l1_regularizer, "my_positive_weights": my_positive_weights, "my_glorot_initializer": my_glorot_initializer, "my_softplus": my_softplus, })

And if you got an exception, please copy the full stacktrace here:

[<ipython-input-43-137f634240f5>](https://m6gi76vt7u-496ff2e9c6d22116-0-colab.googleusercontent.com/outputframe.html?vrz=colab_20240405-060114_RC00_622131336#) in <cell line: 1>()
----> 1 model = keras.models.load_model(
      2     "my_model_with_many_custom_parts.h5",
      3     custom_objects={
      4        "my_l1_regularizer": my_l1_regularizer,
      5        "my_positive_weights": my_positive_weights,

2 frames
[/usr/local/lib/python3.10/dist-packages/keras/src/engine/base_layer.py](https://m6gi76vt7u-496ff2e9c6d22116-0-colab.googleusercontent.com/outputframe.html?vrz=colab_20240405-060114_RC00_622131336#) in from_config(cls, config)
    868             return cls(**config)
    869         except Exception as e:
--> 870             raise TypeError(
    871                 f"Error when deserializing class '{cls.__name__}' using "
    872                 f"config={config}.\n\nException encountered: {e}"

TypeError: Error when deserializing class 'Dense' using config={'name': 'dense_1', 'trainable': True, 'dtype': 'float32', 'units': 1, 'activation': {'module': 'builtins', 'class_name': 'function', 'config': 'my_softplus', 'registered_name': 'function'}, 'use_bias': True, 'kernel_initializer': {'module': 'builtins', 'class_name': 'function', 'config': 'my_glorot_initializer', 'registered_name': 'function'}, 'bias_initializer': {'module': 'keras.initializers', 'class_name': 'Zeros', 'config': {}, 'registered_name': None}, 'kernel_regularizer': {'module': 'builtins', 'class_name': 'function', 'config': 'my_l1_regularizer', 'registered_name': 'function'}, 'bias_regularizer': None, 'activity_regularizer': None, 'kernel_constraint': {'module': 'builtins', 'class_name': 'function', 'config': 'my_positive_weights', 'registered_name': 'function'}, 'bias_constraint': None}.

Exception encountered: Unknown activation function: 'function'. Please ensure you are using a `keras.utils.custom_object_scope` and that this object is included in the scope. See https://www.tensorflow.org/guide/keras/save_and_serialize#registering_the_custom_object for details.

Expected behavior A clear and concise description of what you expected to happen.

I expect to load model without any error.

Versions (please complete the following information): I have run it on google colab

vahidNaghshin commented 2 months ago

It seems the error comes from using h5 extension. It is recommended to use Keras format. After using the .keras extension, it is solved!