Ich bin sehr gespannt darauf, Googles neue Tensorflow-Bibliothek in C ++ zu verwenden. Die Website und die Dokumente sind nur sehr unklar, wie die C ++ - API des Projekts erstellt werden soll, und ich weiß nicht, wo ich anfangen soll.
Kann jemand mit mehr Erfahrung helfen, indem er einen Leitfaden zur Verwendung der C ++ - API von tensorflow entdeckt und weitergibt?
c++
tensorflow
theideasmith
quelle
quelle
Antworten:
Eine Alternative zur Verwendung der Tensorflow C ++ - API, die ich gefunden habe, ist die Verwendung von cppflow .
Es ist ein leichter C ++ - Wrapper um die Tensorflow C-API . Sie erhalten sehr kleine ausführbare Dateien, die mit der
libtensorflow.so
bereits kompilierten Datei verknüpft sind . Es gibt auch Anwendungsbeispiele, und Sie verwenden CMAKE anstelle von Bazel.quelle
Um zu beginnen, sollten Sie den Quellcode von Github herunterladen, indem Sie den Anweisungen hier folgen (Sie benötigen Bazel und eine aktuelle Version von GCC).
Die C ++ - API (und das Backend des Systems) befindet sich in
tensorflow/core
. Derzeit werden nur die C ++ - Sitzungsschnittstelle und die C-API unterstützt. Sie können beide verwenden, um TensorFlow-Diagramme auszuführen, die mit der Python-API erstellt und in einenGraphDef
Protokollpuffer serialisiert wurden . Es gibt auch eine experimentelle Funktion zum Erstellen von Diagrammen in C ++, die derzeit jedoch nicht so umfassend ist wie die Python-API (z. B. derzeit keine Unterstützung für die automatische Differenzierung). Hier sehen Sie ein Beispielprogramm, das in C ++ ein kleines Diagramm erstellt .Der zweite Teil der C ++ - API ist die API zum Hinzufügen einer neuen
OpKernel
, der Klasse, die Implementierungen von numerischen Kerneln für CPU und GPU enthält. Es gibt zahlreiche Beispiele, wie Sie diese einbauen könnentensorflow/core/kernels
, sowie ein Tutorial zum Hinzufügen einer neuen Operation in C ++ .quelle
Um @ mrrys Beitrag zu ergänzen, habe ich ein Tutorial zusammengestellt, in dem erklärt wird, wie ein TensorFlow-Diagramm mit der C ++ - API geladen wird. Es ist sehr minimal und soll Ihnen helfen zu verstehen, wie alle Teile zusammenpassen. Hier ist das Fleisch davon:
Bedarf:
Ordnerstruktur:
tensorflow/tensorflow/|project name|/
tensorflow/tensorflow/|project name|/|project name|.cc (e.g. https://gist.github.com/jimfleming/4202e529042c401b17b7)
tensorflow/tensorflow/|project name|/BUILD
BAUEN:
Zwei Vorbehalte, für die es wahrscheinlich Problemumgehungen gibt:
https://medium.com/@jimfleming/loading-a-tensorflow-graph-with-the-c-api-4caaff88463f
quelle
./loader
eine Fehlermeldung angezeigt :Not found: models/train.pb
.Wenn Sie vermeiden möchten, dass Sie Ihre Projekte mit Bazel erstellen und eine große Binärdatei generieren, habe ich ein Repository zusammengestellt, das die Verwendung der TensorFlow C ++ - Bibliothek mit CMake anweist. Sie finden es hier . Die allgemeinen Ideen lauten wie folgt:
tensorflow/BUILD
(die bereitgestellten enthalten nicht alle C ++ - Funktionen).quelle
Zunächst möchten Sie nach der Installation von
protobuf
undeigen
Tensorflow erstellen:Kopieren Sie dann die folgenden Include-Header und die dynamische gemeinsam genutzte Bibliothek nach
/usr/local/lib
und/usr/local/include
:Zuletzt kompilieren Sie anhand eines Beispiels:
quelle
Wenn Sie daran denken, Tensorflow c ++ api in einem eigenständigen Paket zu verwenden, benötigen Sie wahrscheinlich tensorflow_cc.so (es gibt auch eine ac api-Version tensorflow.so), um die C ++ - Version zu erstellen, die Sie verwenden können:
Hinweis 1: Wenn Sie Intrinsics-Unterstützung hinzufügen möchten, können Sie diese Flags wie folgt hinzufügen:
--copt=-msse4.2 --copt=-mavx
Hinweis 2: Wenn Sie darüber nachdenken, OpenCV auch in Ihrem Projekt zu verwenden, gibt es ein Problem, wenn Sie beide Bibliotheken zusammen verwenden ( Tensorflow-Problem ), und Sie sollten es verwenden
--config=monolithic
.Nach dem Erstellen der Bibliothek müssen Sie sie Ihrem Projekt hinzufügen. Dazu können Sie folgende Pfade einschließen:
Und verknüpfen Sie die Bibliothek mit Ihrem Projekt:
Und wenn Sie Ihr Projekt erstellen, sollten Sie Ihrem Compiler auch mitteilen, dass Sie C ++ 11-Standards verwenden möchten.
Randnotiz: Pfade relativ zu Tensorflow Version 1.5 (Möglicherweise müssen Sie überprüfen, ob sich in Ihrer Version etwas geändert hat).
Auch dieser Link hat mir sehr geholfen, all diese Infos zu finden: Link
quelle
tensorflow/bazel-tensorflow/external/com_google_absl
Mit diesem ShellScript können Sie (die meisten) Abhängigkeiten installieren, klonen, erstellen, kompilieren und alle erforderlichen Dateien in einen
../src/includes
Ordner übertragen:https://github.com/node-tensorflow/node-tensorflow/blob/master/tools/install.sh
quelle
Wenn es Ihnen nichts ausmacht, CMake zu verwenden, gibt es auch das Projekt tensorflow_cc , das die TF C ++ - API für Sie erstellt und installiert, sowie praktische CMake-Ziele, mit denen Sie verknüpfen können. Das Projekt README enthält ein Beispiel und Docker-Dateien, denen Sie leicht folgen können.
quelle
Wenn Sie Tensorflow nicht selbst erstellen möchten und Ihr Betriebssystem Debian oder Ubuntu ist, können Sie vorgefertigte Pakete mit den Tensorflow C / C ++ - Bibliotheken herunterladen. Diese Distribution kann für C / C ++ - Inferenzen mit der CPU verwendet werden. Die GPU-Unterstützung ist nicht enthalten:
https://github.com/kecsap/tensorflow_cpp_packaging/releases
Es gibt Anweisungen zum Einfrieren eines Prüfpunkts in Tensorflow (TFLearn) und zum Laden dieses Modells zur Inferenz mit der C / C ++ - API:
https://github.com/kecsap/tensorflow_cpp_packaging/blob/master/README.md
Achtung: Ich bin der Entwickler dieses Github-Projekts.
quelle
Ich verwende einen Hack / eine Problemumgehung, um zu vermeiden, dass die gesamte TF-Bibliothek selbst erstellt werden muss (was sowohl Zeit (Einrichtung in 3 Minuten) als auch Speicherplatz, Installation von Entwicklungsabhängigkeiten und Größe der resultierenden Binärdatei spart). Es wird offiziell nicht unterstützt, funktioniert aber gut, wenn Sie nur schnell einsteigen möchten.
Installieren Sie TF durch Pip (
pip install tensorflow
oderpip install tensorflow-gpu
). Dann finden Sie seine Bibliothek_pywrap_tensorflow.so
(TF 0. * - 1.0) oder_pywrap_tensorflow_internal.so
(TF 1.1+). In meinem Fall (Ubuntu) befindet es sich bei/usr/local/lib/python2.7/dist-packages/tensorflow/python/_pywrap_tensorflow.so
. Erstellen Sie dann einen Symlink zu dieser Bibliothek, derlib_pywrap_tensorflow.so
irgendwo heißt, wo Ihr Build-System ihn findet (z/usr/lib/local
. B. ). Das Präfixlib
ist wichtig! Sie können ihm auch einen anderenlib*.so
Namen geben. Wenn Sie ihn aufrufenlibtensorflow.so
, erhalten Sie möglicherweise eine bessere Kompatibilität mit anderen Programmen, die für die Arbeit mit TF geschrieben wurden.Erstellen Sie dann ein gewohntes C ++ - Projekt (CMake, Make, Bazel, was auch immer Sie möchten).
Und dann können Sie einfach eine Verknüpfung zu dieser Bibliothek herstellen, um TF für Ihre Projekte verfügbar zu haben (und Sie müssen auch eine Verknüpfung zu
python2.7
Bibliotheken herstellen)! In CMake fügen Sie zB einfach hinzutarget_link_libraries(target _pywrap_tensorflow python2.7)
.Die C ++ - Headerdateien befinden sich um diese Bibliothek herum, z
/usr/local/lib/python2.7/dist-packages/tensorflow/include/
. B. in .Noch einmal: Dieser Weg wird offiziell nicht unterstützt und Sie können in verschiedenen Problemen laufen. Die Bibliothek scheint statisch mit z. B. Protobuf verknüpft zu sein, sodass Sie möglicherweise Probleme mit der ungeraden Verknüpfung oder Laufzeit haben. Aber ich bin in der Lage, ein gespeichertes Diagramm zu laden, die Gewichte wiederherzustellen und Inferenz auszuführen, was IMO die meistgesuchte Funktionalität in C ++ ist.
quelle
undefined reference to 'PyType_IsSubtype'
python2.7
Bibliothek verlinken ... Ich werde den Beitrag entsprechend bearbeiten.Tensorflow selbst bietet nur sehr grundlegende Beispiele für C ++ - APIs.
Hier ist eine gute Ressource, die Beispiele für Datasets, rnn, lstm, cnn und weitere
Tensorflow-C ++ - Beispiele enthält
quelle
Die obigen Antworten sind gut genug, um zu zeigen, wie die Bibliothek erstellt wird, aber wie die Header gesammelt werden, ist immer noch schwierig. Hier teile ich das kleine Skript, mit dem ich die erforderlichen Header kopiere.
SOURCE
ist der erste Parameter, der die Direcoty der Tensorflow-Quelle (Build) ist;DST
ist der zweite Parameter, derinclude directory
die gesammelten Header enthält. (zB in cmakeinclude_directories(./collected_headers_here)
).quelle
mkdir -p $DST/tensorflow$target_dir
vorcp $line $DST/tensorflow/$target_dir