Tensorflow: как преобразовать файлы модели .meta,.data и .index в один файл graph.pb

В тензорном потоке обучение с нуля производило следующие 6 файлов:

  • events.out.tfevents.1503494436.06L7-BRM738
  • model.ckpt-22480.meta​​li >
  • контрольная точка
  • model.ckpt-22480.data-00000-of-00001
  • model.ckpt-22480.index
  • graph.pbtxt

Я хотел бы преобразовать их (или только нужные) в один файл graph.pb, чтобы перенести его в мое приложение для Android.

Я попробовал script freeze_graph.py, но в качестве ввода уже требуется файл input.pb, которого у меня нет. (У меня есть только эти 6 файлов, упомянутых ранее). Как перейти к созданию этого файла freezed_graph.pb? Я видел несколько потоков, но никто не работал на меня.

Ответ 1

Вы можете использовать этот простой скрипт для этого. Но вы должны указать имена выходных узлов.

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())

Если вы не знаете имя выходного узла или узлов, есть два способа

  1. Вы можете изучить график и найти имя с Netron или с консоли summarize_graph утилиты.

  2. Вы можете использовать все узлы в качестве выходных, как показано ниже.

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

(Обратите внимание, что вы должны поместить эту строку непосредственно перед convert_variables_to_constants.)

Но я думаю, что это необычная ситуация, потому что если вы не знаете выходной узел, вы не сможете использовать график на самом деле.

Ответ 2

Как это может быть полезно для других, я также отвечу здесь после ответа на github ;-). Я думаю, что вы можете попробовать что-то вроде этого (с помощью скрипта freeze_graph в tenorflow/python/tools):

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 "

Важным флагом здесь является --input_binary = false, поскольку файл graph.pbtxt находится в текстовом формате. Я думаю, что это соответствует требуемому graph.pb, который является эквивалентом в двоичном формате.

Что касается output_node_names, это действительно сбивает меня с толку, так как у меня все еще есть некоторые проблемы в этой части, но вы можете использовать сценарий sumrize_graph в тензорном потоке, который может принимать pb или pbtxt в качестве ввода.

С Уважением,

Стеф

Ответ 3

Я пробовал скрипт freezed_graph.py, но параметр output_node_name полностью сбивает с толку. Работа не удалась.

Поэтому я попробовал другой: 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

Я использовал установочный пакет tenorflow отсюда: https://github.com/tensorflow/models

Ответ 4

Сначала используйте следующий код для генерации файла graph.pb. с tf.Session() в качестве sess:

    # 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 "

генерировать график замораживания.