Wie ich Keras in C ++ gestartet habe

Vor nicht allzu langer Zeit stand ich vor der Produktionsaufgabe, ein trainiertes neuronales Kesas Netzwerkmodell mit nativem C++ Code zu starten. Seltsamerweise war die Lösung überhaupt nicht trivial. Infolgedessen gab es eine private Bibliothek, die eine solche Gelegenheit bot. Wie es ist - neuronale Netze auf sauberen Kreuzen und wird der heutige kurze Artikel sein.


Für diejenigen, die nicht warten können - hier ist das Github-Repository mit einer detaillierten Beschreibung der Verwendung. Nun, ich frage alle anderen unter der Katze ...


Erklärung des Problems.


Dabei musste ich ein trainiertes Modell in einer C++ Anwendung (Unreal Engune 4) ausführen . Aber hier ist das Pech: Heute gibt es praktisch keine Möglichkeit, das Keras-Modell in C ++ auszuführen.


Die Python Aufrufoption von C++ schien mir nicht gut zu sein. Eine weitere Option bestand darin, das Keras-Modell in ein TensorFlow- Modell zu konvertieren, dann TensoFflow für Kreuze zu erstellen und die TF-API aus C ++ - Code aufzurufen.


Dieser Prozess der Metamorphose wird in diesem Artikel gut beschrieben. Damit ergeben sich aber auch Schwierigkeiten. Zunächst geht TensorFlow durch Bzzel . Und die Lünette selbst ist eine skurrile Sache und weigerte sich, unter UE4 zusammenzubauen . Zweitens ist TF selbst eine ziemlich große und sperrige Sache, aber ich wollte etwas Leichteres und Produktiveres. Ich kann nur sagen, dass auf den Freiflächen von Github ein halb funktionierendes Projekt mit der Funktionalität gefunden wurde, die ich brauchte. Die aktuellen Versionen von Python und Keras jedoch nicht unterstützt. Versuche, es neu zu erstellen, waren erfolglos: Die C ++ - Anwendung stürzte mit dem Core Dump Fehler ab . Es war üblich, meine eigene Implementierung zu schreiben ...


Wir schreiben unsere Bibliothek!


Stein härter drehen, eine Flasche werfen Pivasa Energie setzte ich mich an den Code. Der TensorFlow-Code, Versuche, den im Code enthaltenen Code , einige Kenntnisse über Algorithmen und Datenstrukturen (danke an ITMO für seine Kurse) und gute Musik in meinen Ohren haben mir bei der Implementierung dieser Bibliothek sehr geholfen. Irgendwie wurde die Bibliothek in einer Nacht geschrieben.


Und so treffen Sie: Keras2cpp!


Der erste Teil der Bibliothek ist das Python- Modul zum Speichern des trainierten Modells in einem eigenen Binärformat .


Bei dieser Operation ist nichts kompliziert. Wir lesen einfach das Keras Modell und schreiben Stück für Stück in eine Datei: zuerst , dann die , dann im float Format.


Kommen wir nun zur köstlichsten C ++ - Implementierung.


Der Benutzer hat 2 Entitäten tensor und model .


Tensor - verteilt die Daten, mit denen das neuronale Netzwerk arbeitet, neu und ist eine Computerimplementierung des Tensors. Derzeit unterstützte maximale Abmessung in 4 Dimensionen. Die Dimension jeder Dimension wird im std::vector<int> dims_; und das Gewicht jedes std::vector<int> data_; ist in std::vector<int> data_; . Von den verfügbaren Methoden können void Print() und Tensor Select(int row) unterschieden werden. Die restlichen Vorgänge können Sie im Quellcode sehen. Nachdem die Mathematik für Tensoren geschrieben wurde, begann ich mit der Implementierung von Modellen.


Modell - ist eine Reihe von Schichten, in denen jeweils Operationen an Tensoren und eine Gewichtsmatrix vorgeschrieben sind. Für den virtual bool LoadModel(const std::string& filename); des Benutzers stehen 2 Funktionen zur Verfügung virtual bool LoadModel(const std::string& filename); und virtual bool Apply(Tensor* in, Tensor* out); .


Hier ist ein vollständiges Codebeispiel.


python_model.py:


 import numpy as np from keras import Sequential from keras.layers import Dense #create random data test_x = np.random.rand(10, 10).astype('f') test_y = np.random.rand(10).astype('f') model = Sequential([ Dense(1, input_dim=10) ]) model.compile(loss='mse', optimizer='adam') #train model by 1 iteration model.fit(test_x, test_y, epochs=1, verbose=False) #predict data = np.array([[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]]) prediction = model.predict(data) print(prediction) #save model from keras2cpp import export_model export_model(model, 'example.model') 

cpp_mpdel.cc:


 #include "keras_model.h" int main() { // Initialize model. KerasModel model; model.LoadModel("example.model"); // Create a 1D Tensor on length 10 for input data. Tensor in(10); in.data_ = {{0, 1, 2, 3, 4, 5, 6, 7, 8, 9}}; // Run prediction. Tensor out; model.Apply(&in, &out); out.Print(); return 0; } 

Das ist alles was ich denke. Viel Spaß beim Verwenden, und ich werde zu meinem geliebten C # und Python gehen, um neuronale Netze weiter zu schreiben.


PS


Ich habe diese Bibliothek gern geschrieben. Wenn Sie alles selbst von Grund auf neu schreiben, verstehen Sie mehr, aber wie es funktioniert ... Wir planen, Unterstützung für andere Architekturen und GPUs hinzuzufügen ...


Github-Repository
Quelle

Source: https://habr.com/ru/post/de438398/


All Articles