2016-04-17 10 views
8

Genau wie sollten Python-Modelle für die Verwendung in C++ exportiert werden?Export Tensorflow Graphen aus Python für die Verwendung in C++

Ich versuche, etwas ähnliches zu diesem Tutorial zu tun: https://www.tensorflow.org/versions/r0.8/tutorials/image_recognition/index.html

Ich versuche, mein eigenes TF-Modell in dem C++ API anstelle der Gründung eines zu importieren. Ich habe die Eingabegröße und die Pfade angepasst, aber seltsame Fehler tauchen immer wieder auf. Ich verbrachte den ganzen Tag damit, Stapelüberläufe und andere Foren zu lesen, aber ohne Erfolg.

Ich habe zwei Methoden zum Exportieren des Diagramms ausprobiert.

Methode 1: Metagraph.

...loading inputs, setting up the model, etc.... 

sess = tf.InteractiveSession() 
sess.run(tf.initialize_all_variables()) 


for i in range(num_steps): 
    x_batch, y_batch = batch(50) 
    if i%10 == 0: 
     train_accuracy = accuracy.eval(feed_dict={ 
     x:x_batch, y_: y_batch, keep_prob: 1.0}) 
     print("step %d, training accuracy %g"%(i, train_accuracy)) 
    train_step.run(feed_dict={x: x_batch, y_: y_batch, keep_prob: 0.5}) 

print("test accuracy %g"%accuracy.eval(feed_dict={ 
    x: features_test, y_: labels_test, keep_prob: 1.0})) 

saver = tf.train.Saver(tf.all_variables()) 
checkpoint = 
    '/home/sander/tensorflow/tensorflow/examples/cat_face/data/model.ckpt' 
    saver.save(sess, checkpoint) 

    tf.train.export_meta_graph(filename= 
    '/home/sander/tensorflow/tensorflow/examples/cat_face/data/cat_graph.pb', 
    meta_info_def=None, 
    graph_def=sess.graph_def, 
    saver_def=saver.restore(sess, checkpoint), 
    collection_list=None, as_text=False) 

Methode 1 ergibt sich folgende Fehler, wenn versucht wird, das Programm auszuführen:

[libprotobuf ERROR 
google/protobuf/src/google/protobuf/wire_format_lite.cc:532] String field 
'tensorflow.NodeDef.op' contains invalid UTF-8 data when parsing a protocol 
buffer. Use the 'bytes' type if you intend to send raw bytes. 
E tensorflow/examples/cat_face/main.cc:281] Not found: Failed to load 
compute graph at 'tensorflow/examples/cat_face/data/cat_graph.pb' 

Ich habe auch ein anderes Verfahren zum Exportieren der Graph:

Methode 2: write_graph:

tf.train.write_graph(sess.graph_def, 
'/home/sander/tensorflow/tensorflow/examples/cat_face/data/', 
'cat_graph.pb', as_text=False) 

Diese Version scheint tatsächlich etwas zu laden, aber ich bekomme einen Fehler über Variablen nicht sein initialisiert: durch die Verwendung Schoners

saver = tf.train.Saver(tf.global_variables()) 
saver.save(sess, "C:\\output\\mymodel.ckpt") 
Dann

Running model failed: Failed precondition: Attempting to use uninitialized 
value weight1 
[[Node: weight1/read = Identity[T=DT_FLOAT, _class=["loc:@weight1"], 
_device="/job:localhost/replica:0/task:0/cpu:0"](weight1)]] 
+3

Es gibt "Methode 3: Verwendung freeze_graph". Das vermeidet die Verwendung von Variablen und Ausführen von Wiederherstellungs-Ops - https://github.com/tensorflow/tensorflow/blob/master/tensorflow/python/tools/freeze_graph.py –

+0

Ah, das habe ich gesehen. Aber ich habe Mühe herauszufinden, wie man seine Argumente ausfüllt, genau wie ich nicht weiß, was ich für jedes Argument in export_meta_graph ausfüllen soll. Kennen Sie einen Beispielcode dafür? – Sander

+1

Es gibt ein Beispiel hier: https://github.com/tensorflow/tensorflow/blob/master/tensorflow/python/tools/freeze_graph_test.py –

Antwort

0

Zunächst müssen Sie Definition grafisch darstellen, indem Sie folgenden Befehl

with tf.Session() as sess: 
//Build network here 
tf.train.write_graph(sess.graph.as_graph_def(), "C:\\output\\", "mymodel.pb") 

Speichern Sie dann Ihr Modell-Datei, müssen Sie 2 Dateien an Ihrer Ausgabe, mymodel.ckpt, mymodel.pb

Herunterladen freeze_graph.py von here und führen Sie den folgenden Befehl in C: \ output \ aus. Ändern Sie den Namen des Ausgabeknotens, wenn dieser für Sie anders ist.

Python freeze_graph.py --input_graph mymodel.pb --input_checkpoint mymodel.ckpt --output_node_names softmax/Reshape_1 --output_graph mymodelforc.pb

können Sie mymodelforc.pb verwenden, um direkt von C.

Sie können folgende C-Code verwenden, um den Proto-Datei

#include "tensorflow/core/public/session.h" 
#include "tensorflow/core/platform/env.h" 
#include "tensorflow/cc/ops/image_ops.h" 

Session* session; 
NewSession(SessionOptions(), &session); 

GraphDef graph_def; 
ReadBinaryProto(Env::Default(), "C:\\output\\mymodelforc.pb", &graph_def); 

session->Create(graph_def); 

Jetzt können Sie Session für Inferenz verwenden zu laden.

können Sie Inferenz Parameter gelten, wie folgend:

// Same dimension and type as input of your network 
tensorflow::Tensor input_tensor(tensorflow::DT_FLOAT, tensorflow::TensorShape({ 1, height, width, channel })); 
std::vector<tensorflow::Tensor> finalOutput; 

// Fill input tensor with your input data 

std::string InputName = "input"; // Your input placeholder's name 
std::string OutputName = "softmax/Reshape_1"; // Your output placeholder's name 

session->Run({ { InputName, input_tensor } }, { OutputName }, {}, &finalOutput); 

// finalOutput will contain the inference output that you search for 
+0

was tensorflow version Deniz? Der Grund, warum ich frage, ist, dass die Funktion 'saver.save' in dem Paket, das ich verwende, anscheinend eine '.ckpt.meta'-Datei erzeugt. Ich gehe davon aus, dass das selbe ist, das 'saver.export_meta_graph' erzeugt ... Die jüngste Internet-Recherche scheint darauf hinzuweisen, dass dies ein Unterschied zwischen R11 und R12 war, aber Sie haben das so kürzlich geschrieben, dass ich mich frage, welche Version Sie verwendet haben. – Geronimo

+0

Ich habe diesen Code mit der aktuellsten Tensorflow-Quelle verifiziert. Ckpt.meta-Dateien werden jedoch nicht für C++ benötigt, da Sie bereits mit "write_graph" exportieren. Ich werde den Code aktualisieren, um Verwirrung zu vermeiden –

Verwandte Themen