スタートガイド - TensorFlow
TensorFlowからONNXへの変換入門
Section titled “TensorFlowからONNXへの変換入門”TensorFlowモデル(kerasおよびTFLiteモデルを含む)は、tf2onnxツールを使用してONNXに変換できます。
このチュートリアルの完全なコードはこちらで入手できます。
インストール
Section titled “インストール”まず、TensorFlowがすでにインストールされているPython環境にtf2onnxをインストールします。
pip install tf2onnx(安定版)
または
pip install git+https://github.com/onnx/tensorflow-onnx(GitHubの最新版)
モデルの変換
Section titled “モデルの変換”Kerasモデルとtf関数
Section titled “Kerasモデルとtf関数”Kerasモデルとtf関数は、Python内で直接変換できます。
import tensorflow as tfimport tf2onnximport 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リファレンスを参照してください。
SavedModel
Section titled “SavedModel”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リファレンスを参照してください。
TFLite
Section titled “TFLite”tf2onnxは、tfliteモデルの変換をサポートしています。
python -m tf2onnx.convert --tflite path/to/model.tflite --output dst/path/model.onnx --opset 13
注:Opset番号
Section titled “注:Opset番号”使用するONNX opsetが低すぎると、一部のTensorFlow演算子が変換に失敗します。アプリケーションと互換性のある最大のopsetを使用してください。 完全な変換手順については、tf2onnx READMEを参照してください。
変換されたモデルの検証
Section titled “変換されたモデルの検証”onnxruntimeをインストールします。
pip install onnxruntime
以下のテンプレートを使用して、Pythonでモデルをテストします。
import onnxruntime as ortimport 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 tfmodel = 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への貢献を歓迎します!