web-dev-qa-db-ja.com

Tensorflow:.meta、.data、および.indexモデルファイルを1つのgraph.pbファイルに変換する方法

Tensorflowでは、最初からのトレーニングは次の6つのファイルを生成しました。

  1. events.out.tfevents.1503494436.06L7-BRM738
  2. model.ckpt-22480.meta
  3. チェックポイント
  4. model.ckpt-22480.data-00000-of-00001
  5. model.ckpt-22480.index
  6. graph.pbtxt

私はそれらを(または必要なもののみ)1つのファイルに変換したいと思いますgraph.pb my Android application。

スクリプトを試しましたfreeze_graph.pyしかし、それは入力としてすでにinput.pbファイルを必要としますが、私は持っていません。 (前述のこれらの6つのファイルのみがあります)。これを取得する方法freezed_graph.pbファイル?私はいくつかのスレッドを見ましたが、どれも私のために働いていませんでした。

21
Rafal

これを行うには、この単純なスクリプトを使用できます。ただし、出力ノードの名前を指定する必要があります。

import tensorflow as tf

meta_path = 'model.ckpt-22480.meta' # Your .meta file
output_node_names = ['output:0']    # Output nodes

with tf.Session() as sess:
    # Restore the graph
    saver = tf.train.import_meta_graph(meta_path)

    # Load weights
    saver.restore(sess,tf.train.latest_checkpoint('path/of/your/.meta/file'))

    # Freeze the graph
    frozen_graph_def = tf.graph_util.convert_variables_to_constants(
        sess,
        sess.graph_def,
        output_node_names)

    # Save the frozen graph
    with open('output_graph.pb', 'wb') as f:
      f.write(frozen_graph_def.SerializeToString())

出力ノードの名前がわからない場合、2つの方法があります

  1. Netron またはconsole summarize_graph ユーティリティを使用して、グラフを調べて名前を見つけることができます。

  2. 以下に示すように、すべてのノードを出力ノードとして使用できます。

output_node_names = [n.name for n in tf.get_default_graph().as_graph_def().node]

(この行をconvert_variables_to_constants呼び出しの直前に配置する必要があることに注意してください。)

しかし、出力ノードがわからない場合は実際にグラフを使用できないため、これは異常な状況だと思います。

28
velikodniy

他の人にも役立つかもしれないので、githubでの回答の後にここで回答します;-)。私はあなたがこのようなものを試すことができると思います(tensorflow/python/toolsのfreeze_graphスクリプトで):

python freeze_graph.py --input_graph=/path/to/graph.pbtxt --input_checkpoint=/path/to/model.ckpt-22480 --input_binary=false --output_graph=/path/to/frozen_graph.pb --output_node_names="the nodes that you want to output e.g. InceptionV3/Predictions/Reshape_1 for Inception V3 "

ファイルgraph.pbtxtはテキスト形式であるため、ここで重要なフラグは--input_binary = falseです。私はそれがバイナリ形式で同等である必要なgraph.pbに対応すると思います。

Output_node_namesに関しては、この部分にまだいくつかの問題があるので、私にとって本当に混乱していますが、pbまたはpbtxtを入力として取ることができるtensorflowでsummary_graphスクリプトを使用できます。

よろしく、

ステフ

7
Steph

Freezed_graph.pyスクリプトを試しましたが、output_node_nameパラメーターは完全に紛らわしいです。ジョブが失敗しました。

そこで、もう1つexport_inference_graph.pyを試しました。そして、期待通りに機能しました!

python -u /tfPath/models/object_detection/export_inference_graph.py \
  --input_type=image_tensor \
  --pipeline_config_path=/your/config/path/ssd_mobilenet_v1_pets.config \
  --trained_checkpoint_prefix=/your/checkpoint/path/model.ckpt-50000 \
  --output_directory=/output/path

私が使用したtensorflowインストールパッケージはここからです: https://github.com/tensorflow/models

2
kennyut

まず、次のコードを使用してgraph.pbファイルを生成します。 tf.Session()をセッションとして:

    # Restore the graph
    _ = tf.train.import_meta_graph(args.input)

    # save graph file
    g = sess.graph
    gdef = g.as_graph_def()
    tf.train.write_graph(gdef, ".", args.output, True)

次に、サマリグラフを使用して出力ノード名を取得します。最後に、使用

python freeze_graph.py --input_graph=/path/to/graph.pbtxt --input_checkpoint=/path/to/model.ckpt-22480 --input_binary=false --output_graph=/path/to/frozen_graph.pb --output_node_names="the nodes that you want to output e.g. InceptionV3/Predictions/Reshape_1 for Inception V3 "

フリーズグラフを生成します。

1
lgz00gi