2016-09-13 11 views
10

Obecnie próbuję wyeksportować wyszkolony model TensorFlow jako plik ProtoBuf, aby użyć go z API TensorFlow C++ na Androida. Dlatego używam skryptu freeze_graph.py.TensorFlow freeze_graph.py: Nazwa 'save/Const: 0' odnosi się do Tensora, który nie istnieje

I eksportowane mój model używając tf.train.write_graph:

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

i używam checkpoint zapisywane tf.train.Saver.

Przywołuję freeze_graph.py zgodnie z opisem w górnej części skryptu. Po kompilacji, biegnę

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 

To daje mi się następujący komunikat o błędzie:

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. 

Jak stwierdza błędów nie mam tensora save/Const:0 w moim eksportowanego modelu. Jednak kod freeze_graph.py mówi, że można określić tę nazwę tensora przez flagę filename_tensor_name. Niestety nie mogę znaleźć żadnych informacji na temat tego, czym powinien być ten tensor i jak go poprawnie ustawić dla mojego modelu.

Czy ktoś może mi powiedzieć, jak wytworzyć tensor save/Const:0 w wyeksportowanym modelu ProtoBuf lub jak poprawnie ustawić flagę filename_tensor_name?

Odpowiedz

6

--filename_tensor_name flaga jest używany do określenia nazwy tensora zastępczego utworzonego podczas konstruowania tf.train.Saver dla danego modelu. *

W oryginalnym programie, można wydrukować wartości saver.saver_def.filename_tensor_name aby uzyskać wartość, która powinieneś przekazać tę flagę. Możesz także wydrukować wartość saver.saver_def.restore_op_name, aby uzyskać wartość dla flagi --restore_op_name (ponieważ podejrzewam, że wartość domyślna nie będzie poprawna dla twojego wykresu).

Alternatywnie, tf.train.SaverDef protocol buffer zawiera wszystkie informacje potrzebne do zrekonstruowania odpowiednich informacji dla tych flag. Jeśli wolisz, możesz napisać saver.saver_def do pliku i przekazać nazwę tego pliku jako flagę --input_saver do .


  * Zakres Domyślna nazwa dla tf.train.Saver jest "save/" i zastępczy jest actually a tf.constant() którego nazwa domyślne do "Const:0", co wyjaśnia, dlaczego domyślne flagi, aby "save/Const:0".

2

zauważyłem, że błąd się do mnie, gdy miałem kod ułożone tak:

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) 

Udało się po zmianie układu kodu:

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

Nie jestem pewien, dlaczego czy to. @mrry mógłbyś wyjaśnić to nieco więcej?

+0

+1 Miał ten sam problem, zmienił kolejność linii w dokładnie taki sam sposób, jak napisałeś, rozwiązał problem również dla mnie. Chciałbym też trochę wyjaśnienia :) – kazarey

0

Nie powinno być problemu z najnowszym freeze_graph.py jak mogłem zobaczyć te usunięte:

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

W poprzedniej wersji, to używał restore_op przywrócić modelowi

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

Tak więc, na poprzedniej wersji, jeśli piszesz wykres w pliku .pb przed utworzeniem wygaszacza, będzie to problematyczne. np .:

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) 

Dzieje się tak dlatego, że wykres nie będzie zawierał operacji zapisu/przywracania w celu przywrócenia modelu. Aby rozwiązać ten problem, napisz wykres po zapisaniu pliku .ckpt. Jeśli chcesz, że coś zinterpretowałem, napisz, proszę, poprostu. Niedawno zacząłem nurkować w kodzie tensorflow.

Powiązane problemy