以下、私が参考にしているドラフトのドキュメントをいくつか紹介しました。あなたがスリムを使用している場合、最初に.pb GraphDefファイルを取得するには、export_inference_graph.py
を実行する必要があります。
ほとんどの場合、TensorFlowを使用してモデルをトレーニングすると、GraphDefファイル(通常は.pbまたは.pbtxt拡張子で終わる)とチェックポイントファイルのセットが格納されたフォルダが作成されます。モバイルや組み込みのデプロイメントに必要なものは、「フリーズ」された1つのGraphDefファイル、または変数がインライン定数に変換されているため、すべてが1つのファイルに収められています。 変換を処理するには、freeze_graph.pyスクリプトが必要です。これは、tensorflow/pythons/tools/freeze_graph.pyに保存されています。あなたはこのようにそれを実行します:
bazel build tensorflow/tools:freeze_graph bazel-bin/tensorflow/tools/freeze_graph \ --input_graph=/tmp/model/my_graph.pb \ --input_checkpoint=/tmp/model/model.ckpt-1000 \ --output_graph=/tmp/frozen_graph.pb \ --input_node_names=input_node \ --output_node_names=output_node \
input_graph
引数は、モデルのアーキテクチャを保持しているGraphDefファイルを指している必要があります。あなたのGraphDefがディスク上にテキスト形式で保存されている可能性があります。この場合、 '.pb'の代わりに '.pbtxt'で終わる可能性があります。また、--input_binary=false
フラグをコマンドに追加する必要があります。 input_checkpoint
は、最新の保存されたチェックポイントである必要があります。チェックポイントのセクションで説明したように、完全なファイル名ではなく、チェックポイントのセットに共通のプレフィックスを付ける必要があります。 output_graph
は、フリーズしたGraphDefが保存される場所を定義します。テキスト形式で大量のスペースを占める多くの重み値を含む可能性が高いため、常にバイナリ形式で保存されます。 output_node_names
は、グラフの結果を抽出するノードの名前のリストです。これは、フリーズプロセスがグラフのどの部分が実際に必要であるかを理解する必要があるため、要約操作のようなトレーニングプロセスの成果物であるために必要です。与えられた出力ノードの計算に貢献するopsだけが保持されます。あなたのグラフがどのように使われるのか分かっているならば、これらはフェッチ対象としてSession :: Run()に渡すノードの名前にすぎないはずです。この情報を手元に置いていない場合は、summarize_graph
ツールを実行して、予想される出力に関する提案を得ることができます。 TensorFlowの出力形式は時間の経過とともに変更されているので、input_saver
のように他にあまり使われていないさまざまなフラグもありますが、現代版のフレームワークで訓練されたグラフでは必要ないはずです。