2016-04-22 9 views
2

Diese Frage zu diesem verwandt ist: Export Tensorflow graphs from Python for use in C++definieren feed_dict in C++ für Tensorflow Modelle

Ich versuche, ein Tensorflow Modell von Python zu C++ zu exportieren. Das Problem ist, dass mein neuronales Netz mit einem Platzhalter beginnt, um eine Eingabe zu erhalten, die ein feed_dict erfordert. Ich kann keine C++ API finden, um ein feed_dict für mein Modell zu liefern. Was kann ich tun?

Wenn es keine API für die Bereitstellung von feed_dicts gibt, wie soll ich mein Modell ändern, damit es für C++ - Zwecke ohne Platzhalter trainiert und exportiert werden kann?

+0

Nur eine Vermutung, aber ich würde denken, dass die Android-Bilderkennung App so etwas tut. – etarion

Antwort

7

Die tensorflow::Session::Run()-Methode ist die C++ - Entsprechung der Python-Methode tf.Session.run() und unterstützt das Zuführen von Tensoren mit dem Argument inputs. Wie so viele Dinge in C++ und Python ist es nur ein wenig komplizierter zu verwenden (und in diesem Fall sieht es so aus, als wäre die Dokumentation etwas schlechter ...).

Das Argument inputs hat den Typ const std::vector<std::pair<string, Tensor>>&. Lassen Sie uns diese nach unten brechen:

  • Jedes Element inputs entspricht einem einzelnen Tensor (wie ein Platzhalter), die Sie im Run() Anruf füttern wollen. Ein Element hat den Typ std::pair<string, Tensor>.

  • Das erste Element des std::pair<string, Tensor> ist der Name des Tensor in der Grafik, die Sie füttern wollen. Zum Beispiel, lassen Sie uns in Python sagen Sie hatte:

    p = tf.placeholder(..., name="placeholder") 
    # ... 
    sess.run(..., feed_dict={p: ...}) 
    

    ... dann in C++ ist das erste Element des Paares würde der Wert von p.name sein, die in diesem Fall "placeholder:0"

  • Die zweite wäre, Element der std::pair<string, Tensor> ist der Wert, den Sie als tensorflow::Tensor Objekt einspeisen möchten. Sie haben es selbst in C++ zu bauen, und es ist ein wenig komplizierter, dass ein Numpy Array oder ein Python-Objekt definieren, aber hier ist ein Beispiel dafür, wie eine 2 x 2-Matrix zu spezifizieren:

    using tensorflow::Tensor; 
    using tensorflow::TensorShape; 
    
    Tensor t(DT_FLOAT, TensorShape({2, 2})); 
    auto t_matrix = t.matrix<float>(); 
    t_matrix(0, 0) = 1.0; 
    t_matrix(0, 1) = 0.0; 
    t_matrix(1, 0) = 0.0; 
    t_matrix(1, 1) = 1.0; 
    

    ... und Sie können dann t als zweites Element des Paares übergeben.

+0

Vielen Dank dafür! Ich kann damit arbeiten und ich werde Sie wissen lassen, ob es funktioniert. – Sander

+3

Hey MrRy, es hat funktioniert! Ich bin sehr zufrieden mit dem Ergebnis. Ich möchte auch meine Wertschätzung für die Tatsache ausdrücken, dass Google-Ingenieure, die zweifellos viel Terminkalender haben, die Zeit finden, um Neulingen wie mir zu helfen, Tensorflow zum Laufen zu bringen! Ich brauchte ungefähr 2 Wochen und 6 Stackoverflow-Fragen, um ein Conv-Netz zu erstellen und es nach C++ zu exportieren, aber ihr habt mir wirklich sehr geholfen! – Sander

Verwandte Themen