コンテンツにスキップ

スタートガイド - TensorFlow

TensorFlowモデル(kerasおよびTFLiteモデルを含む)は、tf2onnxツールを使用してONNXに変換できます。

このチュートリアルの完全なコードはこちらで入手できます。

まず、TensorFlowがすでにインストールされているPython環境にtf2onnxをインストールします。

pip install tf2onnx(安定版)

または

pip install git+https://github.com/onnx/tensorflow-onnx(GitHubの最新版)

Kerasモデルとtf関数は、Python内で直接変換できます。

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')]
# tf関数にはfrom_functionを使用します
onnx_model, _ = tf2onnx.convert.from_keras(model, input_signature, opset=13)
onnx.save(onnx_model, "dst/path/model.onnx")

完全なドキュメントについては、Python APIリファレンスを参照してください。

TensorFlowのSavedModelを変換するには、次のコマンドを使用します。

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

path/to/savedmodelは、saved_model.pb含むディレクトリへのパスである必要があります。

完全なドキュメントについては、CLIリファレンスを参照してください。

tf2onnxは、tfliteモデルの変換をサポートしています。

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

使用するONNX opsetが低すぎると、一部のTensorFlow演算子が変換に失敗します。アプリケーションと互換性のある最大のopsetを使用してください。 完全な変換手順については、tf2onnx READMEを参照してください。

onnxruntimeをインストールします。

pip install onnxruntime

以下のテンプレートを使用して、Pythonでモデルをテストします。

import onnxruntime as ort
import numpy as np
# モデルに合わせて形状と型を変更します
input1 = np.zeros((1, 100, 100, 3), np.float32)
# ORT 1.10以降、InferenceSessionをインスタンス化する際に、
# デフォルトのCPUプロバイダー以外の実行プロバイダーを使用する場合は、
# providersパラメータを明示的に設定する必要があります(以前の動作とは異なり、
# ビルドフラグに基づいてプロバイダーがデフォルトで設定/登録されていました)。
# 次のコードは、NVIDIA GPUが利用可能であることを前提としています。
# 他の実行プロバイダーを指定するか、providersパラメータを含めずに
# デフォルトのCPUプロバイダーを使用できます。
sess = ort.InferenceSession("dst/path/model.onnx", providers=["CUDAExecutionProvider"])
# sess.runの最初の引数をNoneに設定して、すべてのモデル出力をデフォルトの順序で使用します
# 入力/出力名はCLIによって出力され、--rename-inputsと--rename-outputsで設定できます
# Python APIを使用している場合、名前は関数の引数名またはTensorSpec名から決定されます。
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")

モデルの変換に失敗した場合は、READMEトラブルシューティングガイドをお読みください。それでも解決しない場合は、GitHubでissueを開いてください。tf2onnxへの貢献を歓迎します!