Skip to content

TypeError: Could not locate class 'QConv2D'.  #126

Open
@OliverFaust

Description

@OliverFaust

Hi,

When I run the QKerasTutorial:
https://github.com/google/qkeras/blob/master/notebook/QKerasTutorial.ipynb
I get the following error:

TypeError: Could not locate class 'QConv2D'. Make sure custom classes are decorated with @keras.saving.register_keras_serializable(). ...

Below is the list of installed packages and the complete console trace.

Thank you for your help in advance.
Oliver

pip list

Package                       Version
----------------------------- ------------
absl-py                       1.4.0
astunparse                    1.6.3
cachetools                    5.3.2
certifi                       2023.11.17
charset-normalizer            3.3.2
dm-tree                       0.1.8
flatbuffers                   23.5.26
gast                          0.5.4
google-auth                   2.25.2
google-auth-oauthlib          1.2.0
google-pasta                  0.2.0
grpcio                        1.60.0
h5py                          3.10.0
idna                          3.6
joblib                        1.3.2
keras                         2.15.0
keras-tuner                   1.4.6
kt-legacy                     1.0.5
libclang                      16.0.6
Markdown                      3.5.1
MarkupSafe                    2.1.3
ml-dtypes                     0.2.0
networkx                      3.2.1
numpy                         1.26.2
oauthlib                      3.2.2
opt-einsum                    3.3.0
packaging                     23.2
parse                         1.6.5
pip                           23.2
protobuf                      4.23.4
pyasn1                        0.5.1
pyasn1-modules                0.3.0
pyparser                      1.0
pyparsing                     3.1.1
QKeras                        0.9.0
requests                      2.31.0
requests-oauthlib             1.3.1
rsa                           4.9
scikit-learn                  1.3.2
scipy                         1.11.4
setuptools                    68.1.2
six                           1.16.0
tensorboard                   2.15.1
tensorboard-data-server       0.7.2
tensorflow                    2.15.0.post1
tensorflow-estimator          2.15.0
tensorflow-io-gcs-filesystem  0.34.0
tensorflow-model-optimization 0.7.5
termcolor                     2.4.0
threadpoolctl                 3.2.0
tqdm                          4.66.1
typing_extensions             4.9.0
urllib3                       2.1.0
Werkzeug                      3.0.1
wheel                         0.42.0
wrapt                         1.14.1

python3 QKerasTutorial.py 
2023-12-17 22:13:39.560279: I external/local_tsl/tsl/cuda/cudart_stub.cc:31] Could not find cuda drivers on your machine, GPU will not be used.
2023-12-17 22:13:39.619692: E external/local_xla/xla/stream_executor/cuda/cuda_dnn.cc:9261] Unable to register cuDNN factory: Attempting to register factory for plugin cuDNN when one has already been registered
2023-12-17 22:13:39.619738: E external/local_xla/xla/stream_executor/cuda/cuda_fft.cc:607] Unable to register cuFFT factory: Attempting to register factory for plugin cuFFT when one has already been registered
2023-12-17 22:13:39.621197: E external/local_xla/xla/stream_executor/cuda/cuda_blas.cc:1515] Unable to register cuBLAS factory: Attempting to register factory for plugin cuBLAS when one has already been registered
2023-12-17 22:13:39.628727: I external/local_tsl/tsl/cuda/cudart_stub.cc:31] Could not find cuda drivers on your machine, GPU will not be used.
2023-12-17 22:13:39.628945: I tensorflow/core/platform/cpu_feature_guard.cc:182] This TensorFlow binary is optimized to use available CPU instructions in performance-critical operations.
To enable the following instructions: AVX2 FMA, in other operations, rebuild TensorFlow with the appropriate compiler flags.
2023-12-17 22:13:40.651978: W tensorflow/compiler/tf2tensorrt/utils/py_utils.cc:38] TF-TRT Warning: Could not find TensorRT
2023-12-17 22:13:42.765716: W external/local_tsl/tsl/framework/cpu_allocator_impl.cc:83] Allocation of 188160000 exceeds 10% of free system memory.
Epoch 1/3
469/469 [==============================] - 62s 130ms/step - loss: 0.2192 - accuracy: 0.9368 - val_loss: 0.0792 - val_accuracy: 0.9766
Epoch 2/3
469/469 [==============================] - 53s 113ms/step - loss: 0.0657 - accuracy: 0.9800 - val_loss: 0.0611 - val_accuracy: 0.9800
Epoch 3/3
469/469 [==============================] - 44s 93ms/step - loss: 0.0457 - accuracy: 0.9863 - val_loss: 0.0550 - val_accuracy: 0.9831
Model: "model"
_________________________________________________________________
 Layer (type)                Output Shape              Param #   
=================================================================
 input_1 (InputLayer)        [(None, 28, 28, 1)]       0         
                                                                 
 conv2d_1 (Conv2D)           (None, 26, 26, 18)        180       
                                                                 
 act_1 (Activation)          (None, 26, 26, 18)        0         
                                                                 
 conv2d_2 (Conv2D)           (None, 24, 24, 32)        5216      
                                                                 
 act_2 (Activation)          (None, 24, 24, 32)        0         
                                                                 
 flatten (Flatten)           (None, 18432)             0         
                                                                 
 dense (Dense)               (None, 10)                184330    
                                                                 
 softmax (Activation)        (None, 10)                0         
                                                                 
=================================================================
Total params: 189726 (741.12 KB)
Trainable params: 189726 (741.12 KB)
Non-trainable params: 0 (0.00 Byte)
_________________________________________________________________
2023-12-17 22:16:24.997914: W external/local_tsl/tsl/framework/cpu_allocator_impl.cc:83] Allocation of 188160000 exceeds 10% of free system memory.
Epoch 1/10
469/469 [==============================] - 84s 175ms/step - loss: 0.2676 - accuracy: 0.9229 - val_loss: 0.1157 - val_accuracy: 0.9656
Epoch 2/10
469/469 [==============================] - 81s 173ms/step - loss: 0.1002 - accuracy: 0.9705 - val_loss: 0.0775 - val_accuracy: 0.9770
Epoch 3/10
469/469 [==============================] - 80s 171ms/step - loss: 0.0710 - accuracy: 0.9791 - val_loss: 0.0659 - val_accuracy: 0.9809
Epoch 4/10
469/469 [==============================] - 78s 166ms/step - loss: 0.0579 - accuracy: 0.9829 - val_loss: 0.0653 - val_accuracy: 0.9781
Epoch 5/10
469/469 [==============================] - 78s 166ms/step - loss: 0.0473 - accuracy: 0.9860 - val_loss: 0.0536 - val_accuracy: 0.9824
Epoch 6/10
469/469 [==============================] - 80s 170ms/step - loss: 0.0395 - accuracy: 0.9880 - val_loss: 0.0612 - val_accuracy: 0.9813
Epoch 7/10
469/469 [==============================] - 80s 171ms/step - loss: 0.0343 - accuracy: 0.9894 - val_loss: 0.0480 - val_accuracy: 0.9836
Epoch 8/10
469/469 [==============================] - 81s 173ms/step - loss: 0.0302 - accuracy: 0.9906 - val_loss: 0.0632 - val_accuracy: 0.9817
Epoch 9/10
469/469 [==============================] - 85s 182ms/step - loss: 0.0262 - accuracy: 0.9920 - val_loss: 0.0461 - val_accuracy: 0.9846
Epoch 10/10
469/469 [==============================] - 80s 170ms/step - loss: 0.0211 - accuracy: 0.9938 - val_loss: 0.0496 - val_accuracy: 0.9844
<keras.src.engine.functional.Functional object at 0x7fa7ea059ad0>
Traceback (most recent call last):
  File "/home/oliver/ARM/hls4ml-tutorial/hls4ml-tutorial/QKerasTutorial.py", line 358, in <module>
    qmodel = model_quantize(model, config, 4, transfer_weights=True)
             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/home/oliver/ARM/hls4ml-tutorial/hls4ml-tutorial/cleanEnv/lib/python3.11/site-packages/qkeras/utils.py", line 805, in model_quantize
    qmodel = quantized_model_from_json(json.dumps(jm), custom_objects)
             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/home/oliver/ARM/hls4ml-tutorial/hls4ml-tutorial/cleanEnv/lib/python3.11/site-packages/qkeras/utils.py", line 894, in quantized_model_from_json
    qmodel = model_from_json(json_string, custom_objects=custom_objects)
             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/home/oliver/ARM/hls4ml-tutorial/hls4ml-tutorial/cleanEnv/lib/python3.11/site-packages/keras/src/saving/legacy/model_config.py", line 125, in model_from_json
    return deserialize_from_json(json_string, custom_objects=custom_objects)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/home/oliver/ARM/hls4ml-tutorial/hls4ml-tutorial/cleanEnv/lib/python3.11/site-packages/keras/src/layers/serialization.py", line 299, in deserialize_from_json
    return deserialize(config, custom_objects)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/home/oliver/ARM/hls4ml-tutorial/hls4ml-tutorial/cleanEnv/lib/python3.11/site-packages/keras/src/layers/serialization.py", line 276, in deserialize
    return serialization_lib.deserialize_keras_object(
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/home/oliver/ARM/hls4ml-tutorial/hls4ml-tutorial/cleanEnv/lib/python3.11/site-packages/keras/src/saving/serialization_lib.py", line 609, in deserialize_keras_object
    return deserialize_keras_object(
           ^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/home/oliver/ARM/hls4ml-tutorial/hls4ml-tutorial/cleanEnv/lib/python3.11/site-packages/keras/src/saving/serialization_lib.py", line 728, in deserialize_keras_object
    instance = cls.from_config(inner_config)
               ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/home/oliver/ARM/hls4ml-tutorial/hls4ml-tutorial/cleanEnv/lib/python3.11/site-packages/keras/src/engine/training.py", line 3330, in from_config
    inputs, outputs, layers = functional.reconstruct_from_config(
                              ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/home/oliver/ARM/hls4ml-tutorial/hls4ml-tutorial/cleanEnv/lib/python3.11/site-packages/keras/src/engine/functional.py", line 1493, in reconstruct_from_config
    process_layer(layer_data)
  File "/home/oliver/ARM/hls4ml-tutorial/hls4ml-tutorial/cleanEnv/lib/python3.11/site-packages/keras/src/engine/functional.py", line 1474, in process_layer
    layer = deserialize_layer(layer_data, custom_objects=custom_objects)
            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/home/oliver/ARM/hls4ml-tutorial/hls4ml-tutorial/cleanEnv/lib/python3.11/site-packages/keras/src/layers/serialization.py", line 276, in deserialize
    return serialization_lib.deserialize_keras_object(
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/home/oliver/ARM/hls4ml-tutorial/hls4ml-tutorial/cleanEnv/lib/python3.11/site-packages/keras/src/saving/serialization_lib.py", line 705, in deserialize_keras_object
    cls = _retrieve_class_or_fn(
          ^^^^^^^^^^^^^^^^^^^^^^
  File "/home/oliver/ARM/hls4ml-tutorial/hls4ml-tutorial/cleanEnv/lib/python3.11/site-packages/keras/src/saving/serialization_lib.py", line 827, in _retrieve_class_or_fn
    raise TypeError(
TypeError: Could not locate class 'QConv2D'. Make sure custom classes are decorated with `@keras.saving.register_keras_serializable()`. Full object config: {'module': 'keras.layers', 'class_name': 'QConv2D', 'config': {'name': 'conv2d_1', 'trainable': True, 'dtype': 'float32', 'filters': 18, 'kernel_size': [3, 3], 'strides': [1, 1], 'padding': 'valid', 'data_format': 'channels_last', 'dilation_rate': [1, 1], 'groups': 1, 'activation': 'linear', 'use_bias': True, 'kernel_initializer': {'module': 'keras.initializers', 'class_name': 'GlorotUniform', 'config': {'seed': None}, 'registered_name': None}, 'bias_initializer': {'module': 'keras.initializers', 'class_name': 'Zeros', 'config': {}, 'registered_name': None}, 'kernel_regularizer': None, 'bias_regularizer': None, 'activity_regularizer': None, 'kernel_constraint': None, 'bias_constraint': None, 'kernel_quantizer': 'stochastic_binary', 'bias_quantizer': 'quantized_po2(4)'}, 'registered_name': None, 'build_config': {'input_shape': [None, 28, 28, 1]}, 'name': 'conv2d_1', 'inbound_nodes': [[['input_1', 0, 0, {}]]]}

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions