Ich versuche, den Workflow für das Trainieren und Bereitstellen eines Tensorflow-Modells für Android herauszufinden. Ich bin mir der anderen Fragen auf StackOverflow bewusst, aber keine von ihnen scheint die Probleme zu lösen, mit denen ich konfrontiert bin.Ausführen eines Tensorflow-Modells unter Android
Nach dem Android Beispiel aus dem Tensorflow Repository zu studieren, das ist, was ich denke, der Workflow sein sollte:
- Erstellen und trainieren Tensorflow Modell in Python.
- Erstellen Sie ein neues Diagramm und übertragen Sie alle relevanten Knoten (d. H. Nicht die Knoten, die für das Training zuständig sind) auf dieses neue Diagramm. Trainierte Gewichtungsvariablen werden als Konstanten importiert, damit sie von der C++ - API gelesen werden können.
- Entwickeln Sie die Android-GUI in Java, indem Sie das native Schlüsselwort verwenden, um einen Aufruf an das Tensorflow-Modell auszugeben.
- Führen Sie Java aus, um den C/C++ - Stubcode für den nativen Tensorflow-Aufruf zu generieren.
- Füllen Sie den Stub aus, indem Sie die Tensorflow C++ API verwenden, um das trainierte/serialisierte Modell einzulesen und darauf zuzugreifen.
- Verwenden Sie Bazel, um sowohl die Java-App, die native Tensorflow-Schnittstelle (als .so-Datei) zu erstellen, als auch die APK zu generieren.
Verwenden Sie adb zum Bereitstellen der APK.
Schritt 6 ist das Problem. Bazel kompiliert gerne eine native (zu OSX) .dylib, die ich über JNI von Java aus aufrufen kann. Android Studio erzeugt ebenfalls eine ganze Menge XML-Code, der die gewünschte GUI erzeugt. Bazel möchte jedoch, dass sich der gesamte Code der Java-App im Topspace-Verzeichnis "WORKSPACE" (im Tensorflow-Repo) befindet, und Android Studio verknüpft sofort alle Arten von externen Bibliotheken aus dem SDK, um GUIs zu erstellen (ich weiß, weil meine Bazel-Kompilierungslauf schlägt fehl, wenn er diese Ressourcen nicht finden kann). Die einzige Möglichkeit, Bazel zu zwingen, eine .so-Datei kompilieren zu lassen, besteht darin, sie zu einer abhängigen Regel einer Android-Regel zu machen. Ein direktes Cross-Compilieren einer nativen Bibliothek ist das, was ich am liebsten meine A.S. Code zu einem Bazel-Projekt.
Wie quadriere ich das? Bazel wird angeblich Android-Code kompilieren, aber Android Studio generiert Code, den Bazel nicht kompilieren kann. Alle Beispiele von Google geben Ihnen einfach Code von einem Repo ohne irgendeinen Hinweis darauf, wie es erzeugt wurde. Soweit ich weiß, soll das XML, das Teil einer Android Studio App ist, nicht von Hand erstellt werden. Wenn es von Hand gemacht werden kann, wie vermeide ich die Notwendigkeit für all diese externen Bibliotheken?
Vielleicht bekomme ich den Workflow falsch, oder es gibt einen Aspekt von Bazel/Android Studio, den ich nicht verstehe. Jede Hilfe wird geschätzt.
Vielen Dank!
Edit:
Es gab einige Dinge, die ich, dass erfolgreich in die Bibliothek Gebäude beigetragen hätte tun endete:
- ich auf die neueste Bazel aktualisiert.
- Ich baute TensorFlow aus der Quelle.
implementiert ich die empfohlene Bazel unter Datei BUILD, mit einem paar Ergänzungen (aus dem Android Beispiel genommen):
cc_binary( name = "libName.so", srcs = ["org_tensorflowtest_MyActivity.cc", "org_tensorflowtest_MyActivity.h", "jni.h", "jni_md.h", ":libpthread.so"], deps = ["//tensorflow/core:android_tensorflow_lib", ], copts = [ "-std=c++11", "-mfpu=neon", "-O2", ], linkopts = ["-llog -landroid -lm"], linkstatic = 1, linkshared = 1, ) cc_binary( name = "libpthread.so", srcs = [], linkopts = ["-shared"], tags = [ "manual", "notap", ], )
Ich habe nicht nachgewiesen, dass diese Bibliothek geladen und in Android verwendet werden kann, noch; Android Studio 1.5 scheint sehr heikel zu sein, das Vorhandensein von nativen Bibliotheken anzuerkennen.
Die Erstellung einer .dylib wird nicht helfen, da Android nicht OSX-dylib ist, ist nur ein OSX-Format. Es ist Linux, Sie müssen ein .so (das ist ziemlich das Gleiche Feature-weise, aber ein anderes Dateiformat). Auch das XML in Android wird von Hand NICHT generiert. In den Google-Beispielen wird so gut wie nichts generiert. Die Tatsache, dass Sie es erwarten, ist wahrscheinlich ein Teil Ihres Problems. –
Auch wenn Ihre Tensorflow-Software Bazel nicht verwenden muss, habe ich noch nie davon gehört, dass es für Android-Arbeit verwendet wird. Gradle ist der neue Standard, und Ant ist der Legacy-Standard. Wenn du Bazel benutzt, bist du entweder blutig oder du machst dein eigenes Ding. –
@amm Konnten Sie es auf Android ausführen, was ist die Größe der App, die Sie gebaut haben? – sau