2017-02-16 1 views
0

Ich versuche, ein Diagramm auf GPU mit Python zu trainieren, um Grafik aus C++ - Prozess zu laden.C++ entspricht dem Argument train.import_meta_graph clear_devices?

status = ReadBinaryProto(Env::Default(), "model.pb", &graph_def); 
session->Create(graph_def); 

Dann bekam ich Fehlermeldung

„Es kann kein Gerät zuweisen ... zum Knoten, da kein Gerät, die Spezifikation passend in diesem Prozess registriert ist; verfügbare Geräte:/Job: localhost/Replik: 0/Aufgabe: 0/cpu: 0 "

Für python train.import_meta_graph API hat clear_devices Argument, aber was ist das Äquivalent von C++ API?

Zum Laden des Diagramms verwende ich Tensorflor unter Windows mit CMake mit -Dtensorflow_ENABLE_GPU = ON, daher hat mein vcxproj die Definition GOOGLE_CUDA.

Ich habe Tensorflow, restore variables in a specific device gelesen, aber es ist nur für Python-API.

Antwort

0

Vorausgesetzt, dass Sie das Diagramm aus Python trotzdem exportieren, können Sie vielleicht ein Diagramm mit den gelöschten Geräten exportieren? Etwas wie:

meta_graph = tf.train.export_meta_graph() 
with tf.Graph().as_default(): 
    tf.train.import_meta_graph(meta_graph, clear_devices=True) 
    # Export the GraphDef now 
    with open('/tmp/model.pb', 'w') as f: 
     f.write(tf.get_default_graph().as_graph_def().SerializeToString()) 

Alternativ können Sie das Verhalten von clear_devices=True in C++ duplizieren, indem Sie das device Feld in der graphischen Darstellung von jedem Knoten Ausräumen. Etwas wie:

status = ReadBinaryProto(Env::Default(), "model.pb", &graph_def); 
for (int n = 0; n < graph_def.node_size(); ++n) { 
    graph_def.mutable_node(n)->clear_device(); 
} 
session->Create(graph_def); 

Aber ich würde dagegen raten, da sie auf interne Details zu verlassen, wie GraphDef s durch den Rahmen verbraucht werden, das zerbrechlich sein könnte.

+0

Für ich benutze train.Saver(), nicht export_meta_graph() auf Python, ich räumte Geräte auf C + +, und Session :: Create() erfolgreich mit diesem Diagramm! Vielen Dank! – Jay