TensorFlow 1.x を使用してモデルをトレーニングすると、そのプロセスによって GraphDef ファイル (通常、拡張子は .pb または .pbtxt) と一連のチェックポイント ファイルを含むフォルダーが作成されます。モバイルまたは組み込みシステムでの運用には、凍結された (または変数をインライン定数に変換してすべてを 1 つのファイルにまとめた) 単一の GraphDef ファイルが必要です。変換処理用として、TensorFlow は freeze_graph.py を提供します。これは vai_q_tensorflow クオンタイザー ツールと共に自動的にインストールされます。
次にコマンド ラインの使用例を示します。
[docker] $ freeze_graph \
--input_graph /tmp/inception_v1_inf_graph.pb \
--input_checkpoint /tmp/checkpoints/model.ckpt-1000 \
--input_binary true \
--output_graph /tmp/frozen_graph.pb \
--output_node_names InceptionV1/Predictions/Reshape_1
`
–input_graph
は、トレーニング グラフ以外の推論グラフである必要があります。データ プリプロセッシング処理と損失関数は推論と運用には不要なため、frozen_graph.pb にはモデルの主要なコンポーネントのみを含めます。特に、Input_fn
には、トレーニング後の量子化のための正しい入力データを生成するため、データ プリプロセッシング処理を受け取る必要があります。
tf.layers.dropout
/tf.layers.batch_normalization
を使用する際にフラグ is_training=false
を設定できます。tf.keras
を使用するモデルの場合、グラフを作成する前に tf.keras.backend.set_learning_phase(0)
を呼び出します。freeze_graph --help
と入力します。入力ノード名と出力ノード名はモデルによって異なりますが、vai_q_tensorflow クオンタイザーを使用して調査および推定できます。次のコード スニペット例を参照してください。
[docker] $ vai_q_tensorflow inspect --input_frozen_graph=/tmp/inception_v1_inf_graph.pb
グラフ内にグラフ用の前処理や後処理がある場合、推定された入力ノードと出力ノードは量子化に使用できません。これは、動作によっては量子化できないものがあり、モデルを Vitis AI コンパイラでコンパイルして DPU 上で運用するとエラーが発生する可能性があるためです。
グラフの入力および出力名を取得するもう 1 つの方法は、グラフを可視化することです。これには、TensorBoard と Netron を使用できます。次の例は Netron を使用しています。
[docker] $ pip install netron
[docker] $ netron /tmp/inception_v3_inf_graph.pb