2016-09-13 2 views
10

В настоящее время я пытаюсь экспортировать обучаемую модель TensorFlow в качестве файла ProtoBuf, чтобы использовать ее с TensorFlow C++ API на Android. Поэтому я использую скрипт freeze_graph.py.TensorFlow freeze_graph.py: Имя «save/Const: 0» относится к тензору, который не существует

Я экспортировал свою модель с помощью tf.train.write_graph:

tf.train.write_graph(graph_def, FLAGS.save_path, out_name, as_text=True)

и я использую контрольно-пропускной пункт сохраняется с tf.train.Saver.

Я вызываю freeze_graph.py, как описано в начале сценария. После компиляции, я бегу

bazel-bin/tensorflow/python/tools/freeze_graph \ 
--input_graph=<path_to_protobuf_file> \ 
--input_checkpoint=<model_name>.ckpt-10000 \ 
--output_graph=<output_protobuf_file_path> \ 
--output_node_names=dropout/mul_1 

Это дает мне следующее сообщение об ошибке:

TypeError: Cannot interpret feed_dict key as Tensor: The name 'save/Const:0' refers to a Tensor which does not exist. The operation, 'save/Const', does not exist in the graph. 

Как говорится ошибки я не имею тензор save/Const:0 в моей экспортированной модели. Тем не менее, код freeze_graph.py говорит, что это имя тензора можно указать флагом filename_tensor_name. К сожалению, я не могу найти никакой информации о том, каким должен быть этот тензор и как правильно установить его для моей модели.

Может ли кто-нибудь сказать мне, как создать тензор save/Const:0 в моей экспортируемой модели ProtoBuf или как правильно установить флаг filename_tensor_name?

ответ

6

Флаг --filename_tensor_name используется для указания имени тензора заполнителя созданного при построить tf.train.Saver для вашей модели. *

В исходной программе, вы можете распечатать значения saver.saver_def.filename_tensor_name, чтобы получить значение, вы должны передать этот флаг. Вы также можете распечатать значение saver.saver_def.restore_op_name, чтобы получить значение для флага --restore_op_name (так как я подозреваю, что значение по умолчанию будет неправильным для вашего графика).

В качестве альтернативы, tf.train.SaverDef protocol buffer содержит всю информацию, необходимую для восстановления соответствующей информации для этих флагов. Если вы предпочитаете, вы можете записать saver.saver_def в файл и передать имя этого файла в качестве флага --input_saver в freeze_graph.py.


  * Название по умолчанию простор для tf.train.Saver является "save/" и заполнитель actually a tf.constant(), чье имя по умолчанию для "Const:0", который объясняет, почему по умолчанию флаг в "save/Const:0".

2

я заметил, что ошибка произошла со мной, когда я был код расположены так:

sess = tf.Session() 
tf.train.write_graph(sess.graph_def, '', '/tmp/train.pbtxt') 
init = tf.initialize_all_variables() 
saver = tf.train.Saver() 
sess.run(init) 

Он работал после того, как я изменил код макета, как это:

# Add ops to save and restore all the variables. 
saver = tf.train.Saver()  
init = tf.initialize_all_variables() 
sess = tf.Session() 
tf.train.write_graph(sess.graph_def, '', '/tmp/train.pbtxt') 
sess.run(init) 

Я не совсем уверен, почему в том, что. @mrry вы могли бы объяснить это немного больше?

+0

+1 Если бы та же проблема, изменив порядок строк точно так же, как вы писали, решила проблему и для меня. Хотел бы и некоторые разъяснения :) – kazarey

0

Это не должно быть проблематично в последнем файле freeze_graph.ру, как я мог видеть эти удалены:

del restore_op_name, filename_tensor_name # Unused by updated loading code. source:freeze_graph.py

В более ранней версии, он использует restore_op восстановить Типовом

sess.run([restore_op_name], {filename_tensor_name: input_checkpoint})

Так, для предыдущей версии, если вы пишете график в файле .pb до создания экземпляра saver op, это будет проблематично. например:

tf.train.write_graph(sess.graph_def, "./logs", "test2.pb", False) 
saver = tf.train.Saver() 
saver.save(sess, "./logs/hello_ck.ckpt", meta_graph_suffix='meta', write_meta_graph=True) 

Это потому, что у графа не будет никаких операций сохранения/восстановления для восстановления модели. Чтобы решить ее, писать график после сохранения .ckpt файлу

saver = tf.train.Saver() 
saver.save(sess, "./logs/hello_ck.ckpt", meta_graph_suffix='meta', write_meta_graph=True) 
tf.train.write_graph(sess.graph_def, "./logs", "test2.pb", False) 

@mrry, пожалуйста, руководство, если я что-то неправильно интерпретированы. Я только недавно начал погружаться в код тензорного потока.