これまでに収集したことから、TensorFlowグラフをファイルにダンプしてから別のプログラムに読み込む方法はいくつかありますが、それらの動作に関する明確な例/情報を見つけることができませんでした。私はすでにこれを知っています:
tf.train.Saver()
を使用してモデルの変数をチェックポイントファイル(.ckpt)に保存し、後で復元します( source )tf.train.write_graph()
およびtf.import_graph_def()
を使用してロードし直します(- source )as_graph_def()
を使用してモデルを保存し、重み/変数については定数にマップします( source )ただし、これらのさまざまな方法に関するいくつかの質問を解決できませんでした。
tf.train.write_graph()
については、重み/変数も保存されますか?tf.import_graph_def()
を使用してフリーズグラフをロードできますか?as_graph_def()
/。ckpt/.pbの違いは何ですか?要するに、私が探しているのは、グラフ(さまざまな操作など)とその重み/変数の両方をファイルに保存する方法で、それを使用してグラフと重みを別のプログラムに読み込むことができます、使用(必ずしも継続/再トレーニングではありません)。
このトピックに関するドキュメントは非常に簡単ではないため、回答/情報をいただければ幸いです。
TensorFlowでモデルを保存する問題に対処する方法はたくさんありますが、少し混乱する可能性があります。各サブ質問を順番に実行します。
チェックポイントファイル(たとえば saver.save()
を tf.train.Saver
オブジェクトで呼び出して生成)には、重みと同じプログラムで定義された他の変数のみが含まれます。それらを別のプログラムで使用するには、関連するグラフ構造を再作成する必要があります(たとえば、コードを実行して再構築するか、 tf.import_graph_def()
を呼び出します)。 saver.save()
を呼び出すと、 MetaGraphDef
を含むファイルも生成されます。このファイルには、グラフと、チェックポイントからの重みをそのグラフに関連付ける方法の詳細が含まれます。詳細については、 チュートリアル を参照してください。
tf.train.write_graph()
は、グラフ構造のみを書き込みます。重みではありません。
Bazelは、TensorFlowグラフの読み取りまたは書き込みとは無関係です。 (たぶん私はあなたの質問を誤解しています:コメントでそれを明確にしてください。)
凍結グラフは、 tf.import_graph_def()
を使用してロードできます。この場合、重みは(通常)グラフに埋め込まれているため、別のチェックポイントをロードする必要はありません。
主な変更点は、モデルに入力されるテンソルの名前と、モデルから取得されるテンソルの名前を更新することです。 TensorFlow Androidデモでは、これは TensorFlowClassifier.initializeTensorFlow()
に渡されるinputName
およびoutputName
文字列に対応します。
GraphDef
はプログラム構造であり、通常はトレーニングプロセスを通じて変更されません。チェックポイントは、トレーニングプロセスの状態のスナップショットであり、通常、トレーニングプロセスのすべてのステップで変化します。その結果、TensorFlowはこれらのタイプのデータに異なるストレージ形式を使用し、低レベルAPIはそれらを保存およびロードするさまざまな方法を提供します。 MetaGraphDef
ライブラリ、 Keras 、および skflow などのより高レベルのライブラリは、これらのメカニズムに基づいて構築し、モデル全体。
次のコードを試すことができます:
with tf.gfile.FastGFile('model/frozen_inference_graph.pb', "rb") as f:
graph_def = tf.GraphDef()
graph_def.ParseFromString(f.read())
g_in = tf.import_graph_def(graph_def, name="")
sess = tf.Session(graph=g_in)