onnx / tensorflow-onnx

Convert TensorFlow, Keras, Tensorflow.js and Tflite models to ONNX
Apache License 2.0
2.33k stars 432 forks source link

tf2onnx.convert.from_keras does not work anymore with tensorflow >= 2.16 #2348

Open Zyrin opened 3 months ago

Zyrin commented 3 months ago

Describe the bug After updating to tensorflow 2.17 (from 2.15) we noticed that tf2onnx.convert.from_keras does not wort anymore. See examples down below.

Urgency Not particularly urgent for us (but maybe for others?).

System information

To Reproduce Here is a simple code snippet with keras.Sequential to reproduce the problem:

import keras
import tf2onnx

model = keras.Sequential([keras.layers.Input((80, 80, 3)), keras.layers.Conv2D(8, 1, 1)])

onnx_model, _ = tf2onnx.convert.from_keras(model, opset = 18, output_path = "test.onnx")

It fails with the following output:

Traceback (most recent call last):
  File ".../test.py", line 6, in <module>
    onnx_model, _ = tf2onnx.convert.from_keras(model, opset = 18, output_path = "test.onnx")
  File ".../.venv/lib/python3.10/site-packages/tf2onnx/convert.py", line 442, in from_keras
    old_out_names = _rename_duplicate_keras_model_names(model)
  File ".../.venv/lib/python3.10/site-packages/tf2onnx/convert.py", line 331, in _rename_duplicate_keras_model_names
    if model.output_names and len(set(model.output_names)) != len(model.output_names):
AttributeError: 'Sequential' object has no attribute 'output_names'. Did you mean: 'output_shape'?

Functional style models like the following:

import keras
import tf2onnx

input = keras.layers.Input((80, 80, 3))
x = keras.layers.Conv2D(8, 1, 1)(input)
model = keras.Model(inputs = input, outputs = x)

onnx_model, _ = tf2onnx.convert.from_keras(model, opset = 18, output_path = "test.onnx")

also fail and produce a different output:

Traceback (most recent call last):
  File ".../test.py", line 8, in <module>
    onnx_model, _ = tf2onnx.convert.from_keras(model, opset = 18, output_path = "test.onnx")
  File ".../.venv/lib/python3.10/site-packages/tf2onnx/convert.py", line 446, in from_keras
    function = _saving_utils.trace_model_call(model, input_signature)
  File ".../.venv/lib/python3.10/site-packages/tensorflow/python/keras/saving/saving_utils.py", line 115, in trace_model_call
    input_signature = model_input_signature(model)
  File ".../.venv/lib/python3.10/site-packages/tensorflow/python/keras/saving/saving_utils.py", line 74, in model_input_signature
    input_specs = model._get_save_spec(dynamic_batch=not keep_original_batch_size)  # pylint: disable=protected-access
AttributeError: 'Functional' object has no attribute '_get_save_spec'. Did you mean: '_set_save_spec'?
fatcat-z commented 3 months ago

Didn't upgrade tf2onnx to support 2.17 yet, it's in the plan.

xjorma commented 1 week ago

Hello, Is this will be fixed one day?

fatcat-z commented 1 week ago

Hello, Is this will be fixed one day?

Sure.

xjorma commented 1 week ago

Hello, Is this will be fixed one day?

Sure.

Thanks, Project are often very complex, and downgrading tensorflow version is not always possible.