coremltools icon indicating copy to clipboard operation
coremltools copied to clipboard

Keras layer '<class 'keras.layers.normalization_v2.BatchNormalization'>' not supported.

Open Ludotrico opened this issue 3 years ago • 3 comments

I am trying to convert MobileNetV2, which uses batch normalization but I run into this error. Is there a workaround?

File "/Users/ludovico/Documents/Documents2.0/School/Glaucoma/code/env/lib/python3.7/site-packages/coremltools/converters/keras/_keras_converter.py", line 828, in convert use_float_arraytype=use_float_arraytype, File "/Users/ludovico/Documents/Documents2.0/School/Glaucoma/code/env/lib/python3.7/site-packages/coremltools/converters/keras/_keras_converter.py", line 605, in _convert_to_spec use_float_arraytype=use_float_arraytype, File "/Users/ludovico/Documents/Documents2.0/School/Glaucoma/code/env/lib/python3.7/site-packages/coremltools/converters/keras/_keras2_converter.py", line 357, in _convert _check_unsupported_layers(model, add_custom_layers) File "/Users/ludovico/Documents/Documents2.0/School/Glaucoma/code/env/lib/python3.7/site-packages/coremltools/converters/keras/_keras2_converter.py", line 121, in _check_unsupported_layers _check_unsupported_layers(layer) File "/Users/ludovico/Documents/Documents2.0/School/Glaucoma/code/env/lib/python3.7/site-packages/coremltools/converters/keras/_keras2_converter.py", line 124, in _check_unsupported_layers raise ValueError("Keras layer '%s' not supported. " % str(type(layer))) ValueError: Keras layer '<class 'keras.layers.normalization_v2.BatchNormalization'>' not supported.

Ludotrico avatar May 31 '21 06:05 Ludotrico

I have the same issue, any solution?

BrandonKynoch avatar Jun 07 '21 11:06 BrandonKynoch

I don't know what's going on here. We support this layer type. We have unit tests for this functionality.

@Ludotrico or @BrandonKynoch - can one of you give us a simple self-contained code example to reproduce this issue?

TobyRoseman avatar Mar 25 '22 18:03 TobyRoseman

@TobyRoseman I found behavior similar to that described above when working in an environment with tensorflow 2.6.0 and coreml 5.2.0. See short example below for reproducing the error.

In my case I was looking for a way to pass the image_input_names value to the converter, which appears to be available through ct.converters.keras.convert but not through ct.convert. Interestingly, converting using ct.convert works but using ct.converters.keras.convert produces the error related to batch normalization. If this should be reported as a separate issue, please let me know.

>>> from tensorflow.keras.applications import MobileNetV3Small
>>> import coremltools as ct
>>> mobilenet = MobileNetV3Small(input_shape=(224,224,3))
>>> converted_mobilenet = ct.convert(mobilenet)
Running TensorFlow Graph Passes: 100%|█████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████| 6/6 [00:00<00:00, 10.07 passes/s]
Converting Frontend ==> MIL Ops: 100%|███████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████| 543/543 [00:00<00:00, 651.10 ops/s]
Running MIL Common passes: 100%|█████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████| 34/34 [00:00<00:00, 41.38 passes/s]
Running MIL Clean up passes: 100%|████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████| 9/9 [00:00<00:00, 101.55 passes/s]
Translating MIL ==> NeuralNetwork Ops: 100%|████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████| 660/660 [00:00<00:00, 2245.55 ops/s]
>>> keras_converted_mobilenet = ct.converters.keras.convert(mobilenet)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/opt/anaconda3/envs/coreml/lib/python3.8/site-packages/coremltools/models/_deprecation.py", line 30, in wrapped
    return obj(*args, **kwargs)
  File "/opt/anaconda3/envs/coreml/lib/python3.8/site-packages/coremltools/converters/keras/_keras_converter.py", line 810, in convert
    spec = _convert_to_spec(
  File "/opt/anaconda3/envs/coreml/lib/python3.8/site-packages/coremltools/converters/keras/_keras_converter.py", line 582, in _convert_to_spec
    from . import _keras2_converter
  File "/opt/anaconda3/envs/coreml/lib/python3.8/site-packages/coremltools/converters/keras/_keras2_converter.py", line 54, in <module>
    _keras.layers.normalization.BatchNormalization: _layers2.convert_batchnorm,
AttributeError: module 'keras.layers.normalization' has no attribute 'BatchNormalization'

tim-xoi avatar May 23 '22 20:05 tim-xoi

Multi-backend Keras support has been removed in coremltools 6.0.

TobyRoseman avatar Sep 20 '22 17:09 TobyRoseman