wake-up-neo.com

Konvertieren Sie das Keras-Modell in C++

Ich benutze Keras (mit Theano), um mein CNN-Modell zu trainieren. Hat jemand eine Idee, wie ich es in meiner C++ - Anwendung verwenden kann? Hat jemand etwas Ähnliches ausprobiert? Ich habe die Idee, einen Python-Code zu schreiben, der einen C++ - Code mit Netzwerkfunktionen generiert - einen Vorschlag dazu?

Ich habe eine ähnliche Frage hier gefunden, wie man das Tensorflow Keras-Modell in C++ verwendet, jedoch ohne Antwort.

27
pplonski

Um meine eigene Frage zu beantworten und eine Lösung zu haben, habe ich eine einfache C++ - Lösung mit dem Namen keras2cpp (dessen Code ist auf github verfügbar) geschrieben.

In dieser Lösung speichern Sie Netzwerkarchitektur (in Json) und Gewichte (in HDF5). Dann können Sie ein Netzwerk mit dem bereitgestellten Skript in eine reine Textdatei speichern. Sie können die erhaltene Textdatei mit dem Netzwerk in reinem C++ - Code verwenden. Es gibt keine Abhängigkeiten von Python-Bibliotheken oder hdf5. Es sollte für das Theano- und Tensorflow-Backend funktionieren.

34
pplonski

Ich befand mich in einer ähnlichen Situation, musste aber nicht nur Vorwärtsdurchläufe von sequentiellen Keras-Modellen in C++ unterstützen, sondern auch komplexere Modelle, die mit der funktionalen API erstellt wurden.

Also schrieb ich eine neue Bibliothek namens sparsam tief. Sie finden es auf GitHub und es wird unter der MIT Lizenz veröffentlicht: https://github.com/Dobiasd/frugally-deep

Neben der Unterstützung vieler gängiger Layer-Typen kann es mit der Leistung von TensorFlow auf einer einzelnen CPU mithalten (und diese sogar übertreffen). Aktuelle Benchmark-Ergebnisse für einige gängige Modelle finden Sie im Repo .

Durch das automatische Testen wird sparsam garantiert, dass die Ausgabe eines Modells, das damit in C++ verwendet wird, genau derselbe ist, als würden sie mit Keras in Python ausgeführt.

9
Tobias Hermann

Wenn Ihr Keras-Modell mit dem Tensorflow-Backend trainiert wird, können Sie das Keras-Modell als Tensorflow-Modell mit folgendem Code speichern: https://github.com/amir-abdi/keras_to_tensorflow

Hier ist eine kürzere Version des Codes:

from keras import backend as K
from tensorflow.python.framework import graph_util
from tensorflow.python.framework import graph_io

weight_file_path = 'path to your keras model'
net_model = load_model(weight_file_path)
sess = K.get_session()

constant_graph = graph_util.convert_variables_to_constants(sess, sess.graph.as_graph_def(), 'name of the output tensor')
graph_io.write_graph(constant_graph, 'output_folder_path', 'output.pb', as_text=False)
print('saved the constant graph (ready for inference) at: ', osp.join('output_folder_path', 'output.pb'))
4
AHA

Am einfachsten ist es wahrscheinlich, einen Systemaufruf mit einem Python-Skript auszuführen, das die Vorhersagen in eine Binärdatei oder HDF5 -Datei schreibt, die aus C++ eingelesen werden kann. Sie können auch Python direkt in C++ integrieren .

Wenn Sie dies auf einfache Weise bereitstellen und verteilen müssen, können Sie in abgeschlossene Python-Installationen wie Anaconda schauen, aber Sie sollten Keras vermeiden und die C++ - Schnittstelle verwenden, um Caffe oder Tensorflow. Ich würde Tensorflow nicht empfehlen, da die Verwendung von C++ nicht Standard ist; siehe diese Diskussion . Caffe ist wohl die zweitbeliebteste Bibliothek für tiefgreifende Lernprozesse , so dass Sie nichts falsch machen können.

3
1''

Die hier gefundenen Lösungen sind ziemlich gut, aber wenn Ihr Modell über verschiedene Arten von Ebenen verfügt, die von diesen Bibliotheken nicht unterstützt werden, würde ich Folgendes empfehlen:

  • Konvertierung des Keras-Modells in ein Tensorflow-Modell. 
  • Frieren Sie das Modell ein und verwenden Sie das Tranform-Grafiktool, das von tensorflow bereitgestellt wird.
  • Kompilieren Sie die C++ API-Tensorflow-Bibliothek, um sie in Ihrem Projekt zu verwenden. 
  • Verwenden Sie die C++ API-Tensorflow-Bibliothek und verknüpfen Sie die Bibliotheken mit Ihrem Projekt.

Wenn Sie einen etwas anderen Compiler als bazel verwenden möchten (wie zum Beispiel g ++), können Sie diesem großartigen Kurs folgen: 

http://tuatini.me/building-tensorflow-as-a-standalone-project/

2
TFreitas

Ich hatte ein ähnliches Bedürfnis - ich wollte Keras-Modelle in eine C++ - Anwendung einbetten - und entschied mich, meine eigene Bibliothek zu schreiben: Kerasify

Designziele von Kerasify:

  • Kompatibilität mit der Bildverarbeitung Sequentielle Netzwerke, die von Keras mit dem Theano-Backend generiert werden. (Könnte mit Tensorflow funktionieren, wenn Sie die Matrixreihenfolge umstellen).
  • Keine externen Abhängigkeiten, Standardbibliothek, C++ 11-Features OK.
  • Auf Festplatte gespeichertes Modell im Binärformat, das schnell gelesen werden kann.
  • Modell in einem zusammenhängenden Block im Speicher gespeichert, um die Cache-Leistung zu verbessern.
  • Löst keine Ausnahmen aus, gibt bei Fehler nur bool zurück.
  • Nur CPU, keine GPU

Beispielcode, Komponententests usw. am Github-Link. Es ist nicht vollständig, es unterstützt nur die begrenzte Teilmenge der Keras-Funktionen, die ich verwende, es sollte jedoch mit wenig Aufwand erweiterbar sein.

2
moof2k

Sie können dieses probieren https://github.com/gosha20777/keras2cpp

Keras2cpp ist eine kleine Bibliothek zum Ausführen von geschulten Keras-Modellen aus einer C++ - Anwendung ohne Abhängigkeiten.

Unterstützte Keras-Ebenen: - Dichten - Convolution1D - Convolution2D - Convolution3D - Flatten - ELU - Aktivierung - MaxPooling2D -- LocallyConnected1D - LocallyConnected2D - LSTM - GRU - CNN - BatchNormalization

Unterstützte Aktivierung: - linear - relu - softplus - tanh - sigmoid - hard_sigmoid - elu - softsign - softmax

Designziele:

  • Kompatibilität mit Netzwerken, die von Keras mit dem TensorFlow-Backend erstellt wurden.
  • Nur CPU.
  • Keine externen Abhängigkeiten, Standardbibliothek, C++ 17.
  • Modell im Speicher abgelegt.