wake-up-neo.com

TensorFlow freeze_graph.py: Der Name 'save/Const: 0' bezieht sich auf einen Tensor, der nicht existiert

Ich versuche gerade, ein trainiertes TensorFlow-Modell als ProtoBuf-Datei zu exportieren, um es mit der TensorFlow C++ - API auf Android zu verwenden. Daher verwende ich das Skript freeze_graph.py .

Ich habe mein Modell mit tf.train.write_graph exportiert:

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

und ich verwende einen mit tf.train.Saver gespeicherten Prüfpunkt.

Ich rufe freeze_graph.py auf, wie oben im Skript beschrieben. Nach dem Kompilieren renne ich

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

Dies gibt mir die folgende Fehlermeldung:

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.

Wie der Fehler besagt, habe ich in meinem exportierten Modell keinen Tensor save/Const:0. Der Code von freeze_graph.py sagt jedoch aus, dass man diesen Tensornamen mit dem Flag filename_tensor_name angeben kann. Leider kann ich keine Informationen darüber finden, was dieser Tensor sein soll und wie er richtig für mein Modell eingestellt werden kann.

Kann mir jemand sagen, wie er einen save/Const:0-Tensor in meinem exportierten ProtoBuf-Modell erzeugt, oder wie er das Flag filename_tensor_name richtig setzt?

12
mackcmillion

Das Flag --filename_tensor_name wird verwendet, um den Namen eines Platzhaltertensors anzugeben, der erstellt wird, wenn Sie ein tf.train.Saver für Ihr Modell erstellen. *

In Ihrem ursprünglichen Programm können Sie den Wert von saver.saver_def.filename_tensor_name ausdrucken, um den Wert zu erhalten, den Sie für dieses Flag übergeben sollten. Möglicherweise möchten Sie auch den Wert von saver.saver_def.restore_op_name drucken, um einen Wert für das --restore_op_name-Flag zu erhalten (da ich vermute, dass der Standardwert für Ihr Diagramm nicht korrekt ist).

Alternativ enthält der Protokollpuffer tf.train.SaverDef alle Informationen, die Sie zum Rekonstruieren der relevanten Informationen für diese Flags benötigen. Wenn Sie möchten, können Sie saver.saver_def in eine Datei schreiben und den Namen dieser Datei als --input_saver-Flag an freeze_graph.py übergeben.


* Der Standardnamenbereich für einen tf.train.Saver ist "save/" und der Platzhalter ist eigentlich eine tf.constant() , deren Name standardmäßig "Const:0" lautet. Dies erklärt, warum das Flag "save/Const:0" standardmäßig verwendet wird.

6
mrry

Ich habe festgestellt, dass mir ein Fehler passiert ist, als ich den Code so angeordnet hatte:

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)

Es hat funktioniert, nachdem ich das Code-Layout so geändert habe:

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

Ich weiß nicht genau, warum das so ist. @mrry könntest du es etwas mehr erklären?

2
Drag0

Einige Follow-up auf @ Drag0 Antwort und warum das neue Code-Layout den Fehler behoben.

Wenn Sie saver = tf.train.Saver() aufrufen, fügen Sie dem Standarddiagramm die verschiedenen Variablen hinzu, die mit tf.train.Saver() zusammenhängen, z. B. 'save/Const:0'.

In der ersten Codeanordnung wird der Graph zuvor ohne die Variablen tf.train.Saver() gespeichert. In der zweiten Codeanordnung wird es danach gespeichert, sodass die Operation save/Const In der Grafik vorhanden ist.

1
TaraBar

Es sollte in der neuesten freeze_graph.py nicht problematisch sein, da diese entfernt wurden:

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

In früheren Versionen wurde restore_op zum Wiederherstellen des Modells verwendet

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

Wenn Sie also in einer früheren Version das Diagramm in eine .pb-Datei schreiben, bevor Sie den Saver Op instanziieren, ist dies problematisch. z.B.:

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)

Dies liegt daran, dass das Diagramm keine Operation zum Speichern/Wiederherstellen des Modells enthält. Schreiben Sie nach dem Speichern der .ckpt-Datei ein Diagramm, um das Problem zu beheben

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, bitte führen Sie, wenn ich etwas falsch interpretiert. Ich habe erst kürzlich angefangen, in Tensorflow-Code zu tauchen.

0
Saurabh yadav