Erste Schritte: Konvertierung von TensorFlow zu ONNX

TensorFlow-Modelle (einschließlich Keras- und TFLite-Modelle) können mit dem tf2onnx-Tool in ONNX konvertiert werden.

Der vollständige Code für dieses Tutorial ist hier verfügbar.

Installation

Installieren Sie zuerst tf2onnx in einer Python-Umgebung, in der bereits TensorFlow installiert ist.

pip install tf2onnx (stabil)

ODER

pip install git+https://github.com/onnx/tensorflow-onnx (neueste Version von GitHub)

Konvertierung eines Modells

Keras-Modelle und TF-Funktionen

Keras-Modelle und TF-Funktionen können direkt in Python konvertiert werden.

import tensorflow as tf
import tf2onnx
import onnx

model = tf.keras.Sequential()
model.add(tf.keras.layers.Dense(4, activation="relu"))

input_signature = [tf.TensorSpec([3, 3], tf.float32, name='x')]
# Use from_function for tf functions
onnx_model, _ = tf2onnx.convert.from_keras(model, input_signature, opset=13)
onnx.save(onnx_model, "dst/path/model.onnx")

Weitere Informationen finden Sie in der Python API-Referenz.

SavedModel

Konvertieren Sie ein TensorFlow SavedModel mit dem Befehl

python -m tf2onnx.convert --saved-model path/to/savedmodel --output dst/path/model.onnx --opset 13

path/to/savedmodel sollte der Pfad zu dem Verzeichnis sein, das saved_model.pb enthält.

Weitere Informationen finden Sie in der CLI-Referenz.

TFLite

tf2onnx unterstützt die Konvertierung von TFLite-Modellen.

python -m tf2onnx.convert --tflite path/to/model.tflite --output dst/path/model.onnx --opset 13

HINWEIS: Opset-Nummer

Einige TensorFlow-Operationen können nicht konvertiert werden, wenn die verwendete ONNX-Opset-Nummer zu niedrig ist. Verwenden Sie die größte Opset-Nummer, die mit Ihrer Anwendung kompatibel ist. Vollständige Anweisungen zur Konvertierung finden Sie in der tf2onnx README.

Überprüfung eines konvertierten Modells

Installieren Sie onnxruntime mit

pip install onnxruntime

Testen Sie Ihr Modell in Python mit der folgenden Vorlage

import onnxruntime as ort
import numpy as np

# Change shapes and types to match model
input1 = np.zeros((1, 100, 100, 3), np.float32)

# Start from ORT 1.10, ORT requires explicitly setting the providers parameter if you want to use execution providers
# other than the default CPU provider (as opposed to the previous behavior of providers getting set/registered by default
# based on the build flags) when instantiating InferenceSession.
# Following code assumes NVIDIA GPU is available, you can specify other execution providers or don't include providers parameter
# to use default CPU provider.
sess = ort.InferenceSession("dst/path/model.onnx", providers=["CUDAExecutionProvider"])

# Set first argument of sess.run to None to use all model outputs in default order
# Input/output names are printed by the CLI and can be set with --rename-inputs and --rename-outputs
# If using the python API, names are determined from function arg names or TensorSpec names.
results_ort = sess.run(["output1", "output2"], {"input1": input1})

import tensorflow as tf
model = tf.saved_model.load("path/to/savedmodel")
results_tf = model(input1)

for ort_res, tf_res in zip(results_ort, results_tf):
    np.testing.assert_allclose(ort_res, tf_res, rtol=1e-5, atol=1e-5)

print("Results match")

Konvertierungsfehler

Wenn Ihr Modell fehlschlägt, lesen Sie bitte unsere README und Fehlerbehandlungsanleitung. Wenn das nicht hilft, können Sie gerne ein Problem auf GitHub eröffnen. Beiträge zu tf2onnx sind willkommen!

Nächste Schritte