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

В тензорном потоке обучение с нуля сформировало следующие 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

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

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


person Rafal    schedule 24.08.2017    source источник
comment
См. Здесь: stackoverflow.com/questions/45433231/   -  person Dat Tran    schedule 24.08.2017
comment
Как вы попали graph.pbtxt? Если это график вашей модели, вы можете заморозить его с помощью freeze.py. .pbtxt.   -  person velikodniy    schedule 24.08.2017
comment
Файл graph.pbtxt я нашел в журналах обучения после завершения обучения. Однако он был сохранен до завершения тренировки. Проверьте это в ранее сохраненном состоянии графика. Для обучения с нуля я использовал скрипт: train_image_classifier.py. Для обучения я использовал свои собственные изображения (.jpg), которые мне пришлось преобразовать в файлы .tfrecord перед использованием скрипта build_image_data.py   -  person Rafal    schedule 24.08.2017


Ответы (4)


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

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

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

person velikodniy    schedule 24.08.2017
comment
Есть ли простой способ получить имена выходных узлов? - person rambossa; 19.09.2017
comment
Я пытаюсь сделать то же самое. Есть ли способ найти имена выходных узлов? - person blueether; 17.12.2017
comment
Вы можете использовать утилиту summarize_graph. - person velikodniy; 18.12.2017
comment
Я получаю эту ошибку, возможно, потому, что я не уверен, что мои output_node_names верны. File "/path/to/saver.py", line 1796, in restore raise ValueError("Can't load save_path when it is None.") - person craq; 08.08.2018
comment
Конечно. Это немного длинновато для комментария, поэтому я поместил его здесь: pastebin.com/2YLjtMvQ - person craq; 09.08.2018
comment
@craq Похоже, он не может найти ни одной контрольной точки в текущем каталоге (с именем пути .) Попробуйте явно указать путь к вашей контрольной точке: saver.restore(sess, 'path/to/model.ckpt'). - person velikodniy; 09.08.2018
comment
Исправление папки определенно помогло, и я думаю, что это тоже мог быть плохо отформатированный ckpt файл. Оказывается, у меня были и другие проблемы с тренировками. Как только я их исправлю, проблема исчезнет. (У меня осталась проблема, что то, что я считал своими output_node_names, на самом деле not in graph. Но я уверен, что скоро это выясню) - person craq; 10.08.2018
comment
Попробуйте: [n.name для n в tf.get_default_graph (). As_graph_def (). Node] - person gogasca; 20.09.2018
comment
Если кто-нибудь придет сюда и столкнется с той же проблемой, что и я, например, при попытке заморозить график, он потерпит неудачу с попыткой использовать неинициализированное значение, просто добавьте init=tf.global_variables_initializer() sess.run(init) после загрузки весов. - person Eek; 06.11.2018
comment
@ niza-siwale Спасибо за редактирование, но ваш код помещает все узлы в output_node_names, а не только на выходной узел, как это предлагается в документации. - person velikodniy; 10.01.2019
comment
@velikodniy извини, я собирался исправить свою ошибку, но забыл. Спасибо за помощь - person Niza Siwale; 10.01.2019
comment
В чем разница по сравнению с freeze_graph.py? - person mrgloom; 14.03.2019
comment
Что такое tf.train.latest_checkpoint('.'), его нужно заменить на каталог контрольной точки? - person mrgloom; 14.03.2019
comment
Это лучший способ получить "обучаемые" переменные и автоматизировать сохранение модели vars_train = tf.trainable_variables() output_node_names = [var.name.split(":")[0] for var in vars_train] - person Juan; 10.12.2019
comment
@Juan Обычно не все обучаемые переменные являются необходимыми узлами вывода. Более того, выходной узел может вообще не быть переменной. Например, на графике для выражения a * x + 1 выходным узлом является add. - person velikodniy; 11.12.2019

Поскольку это может быть полезно для других, я также отвечу здесь после ответа на github ;-). Я думаю, вы можете попробовать что-то вроде этого (со скриптом freeze_graph в tensorflow / 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, это действительно сбивает меня с толку, поскольку у меня все еще есть некоторые проблемы с этой частью, но вы можете использовать сценарий summarize_graph в тензорном потоке, который может принимать pb или pbtxt в качестве входных данных.

С уважением,

Стеф

person Steph    schedule 25.08.2017
comment
что я должен использовать для ssd_mobilnet_v1_coco вместо -out_node_name - person abhimanyuaryan; 17.07.2019
comment
@PratikKhadloya, пожалуйста, ответьте на мой комментарий выше? - person abhimanyuaryan; 17.07.2019
comment
Пример использования: python freeze_graph.py --input_graph=some_graph_def.pb --input_checkpoint=model.ckpt-8361242 --output_graph=/tmp/frozen_graph.pb --output_node_names=softmax - person Pratik Khadloya; 17.07.2019

Я попробовал скрипт 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

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

person kennyut    schedule 13.06.2018
comment
привет @kennynut что это --pipeline_config_path? что написано в таком файле, не могли бы вы привести мне пример? Некоторое время я использую тензорный поток, но мне никогда не приходилось использовать такой файл конфигурации. - person Scott Yang; 16.11.2018
comment
Pipeline_config_path предоставляет базовую конфигурацию для правильной работы замороженного графа. Скажем, обычно он идет с именем по умолчанию-pipeline.config - в корневом пути по умолчанию для сжатых пакетов среди зоопарков моделей из репозиториев google git hub. - person Neveroldmilk; 02.01.2019

Сначала используйте следующий код для создания файла 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 "

для создания графа замораживания.

person lgz00gi    schedule 19.12.2018