Skip to content

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

Open
@Zyrin

Description

@Zyrin

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

  • OS Platform and Distribution (e.g., Linux Ubuntu 18.04*): 22.04
  • TensorFlow Version: >=2.16
  • Python version:3.10.12

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'?

Metadata

Metadata

Assignees

No one assigned

    Labels

    bugAn unexpected problem or unintended behavior

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions