Тензор потока: как преобразовать файлы моделей.meta, .data и.index в один файл graph.pb
В тензорном потоке тренировка с нуля выдает следующие 6 файлов:
- events.out.tfevents.1503494436.06L7-BRM738
- model.ckpt-22480.meta
- контрольно-пропускной пункт
- model.ckpt-22480.data-00000-оф-00001
- model.ckpt-22480.index
- graph.pbtxt
Я хотел бы преобразовать их (или только необходимые) в один файл graph.pb, чтобы иметь возможность перенести его в мое приложение для Android.
Я пробовал скрипт freeze_graph.py
но он требует в качестве входных данных уже файл input.pb, которого у меня нет. (У меня есть только эти 6 файлов, упомянутых ранее). Как получить этот файл freezed_graph.pb? Я видел несколько потоков, но ни один не работал для меня.
3 ответа
Вы можете использовать этот простой скрипт для этого. Но вы должны указать имена выходных узлов.
import tensorflow as tf
meta_path = 'model.ckpt-22480.meta' # Your .meta file
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('.'))
# Output nodes
output_node_names =[n.name for n in tf.get_default_graph().as_graph_def().node]
# 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())
Как это может быть полезно для других, я также отвечу здесь после ответа на 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 в качестве входных данных.
С Уважением,
Стеф
Я пробовал скрипт 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
Сначала используйте следующий код для генерации файла 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 "
генерировать график замораживания.