Nachtrag 3: Ich habe eine Korrekturanfrage bezüglich der Notation von @ 84d010m08 erhalten und zusammengeführt. Vielen Dank. Derzeit scheint es zwei Methoden zu geben: Tensor Flow Mobile und Lite. Weitere Informationen finden Sie in diesem Artikel.
Nachtrag 2: Eine korrekte Erklärung finden Sie in der offiziellen Erklärung. https://www.tensorflow.org/mobile/android_build
Nachtrag: Der Inhalt dieses Artikels ist veraltet. Um die aktuelle Methode sehr einfach zu erklären, schreiben Sie den folgenden Inhalt in build.gradle.
build.gradle
allprojects {
repositories {
jcenter()
}
}
dependencies {
compile 'org.tensorflow:tensorflow-android:+'
}
Auf diese Weise können Sie das TensorFlowInferenceInterface verwenden. (Siehe den alten Artikel unten für TensorFlowInferenceInterface) Die Namen der Methoden haben sich stark geändert, daher ist es eine gute Idee, sie im offiziellen Repository zu suchen. Zum Zeitpunkt der Hinzufügung ・ Mit Feed eingeben () ・ Lerne mit run () -Fetch-Ausgabe mit fetch () ist. https://github.com/tensorflow/tensorflow/blob/master/tensorflow/contrib/android/java/org/tensorflow/contrib/android/TensorFlowInferenceInterface.java
Artikel vor Hinzufügung unten
Obwohl es einige Artikel gab, in denen Tensorflow auf Android ausgeführt wurde, http://qiita.com/tomoima525/items/99a2df5cb0559c41647a http://qiita.com/ornew/items/cf7e4478936fbf28b271 http://qiita.com/ornew/items/cf7e4478936fbf28b271 http://qiita.com/miyosuda/items/e53ad2efeed0ff040606 Da es kein japanisches Dokument zur einfachen Ausführung mit der TensorFlowInferenceInterface-Klasse gab, war es nur ein Memo. Mit der Methode in diesem Artikel können Sie eine App nur mit dem trainierten Modell und Android Studio erstellen. Es gibt viele gute Artikel zur Verwendung von Deep Learning und zur Verwendung von Tensorflow. Suchen Sie daher nach diesen Artikeln.
Ich schreibe viel, also werde ich es eins nach dem anderen reparieren, wenn ich Zeit habe.
Die folgenden drei. https://github.com/tensorflow/tensorflow/blob/master/tensorflow/java/ https://github.com/tensorflow/tensorflow/tree/master/tensorflow/contrib/android https://github.com/tensorflow/tensorflow/tree/master/tensorflow/examples/android
Aus der Erstellung von .jar- und .so-Dateien. Entspricht dem Inhalt des folgenden offiziellen Dokuments. https://github.com/tensorflow/tensorflow/tree/master/tensorflow/contrib/android
Wenn Sie nicht Bazel setzen wollen https://ci.tensorflow.org/view/Nightly/job/nightly-android/ Es scheint, dass Sie eine vorgefertigte Datei von (unbestätigt) erhalten können
Als allererstes
git clone --recurse-submodules https://github.com/tensorflow/tensorflow.git
Laden Sie die Tensorflow-Quelle unter herunter
Nächster
tensorflow/WORKSPACE
Innen wechseln Kommentieren Sie den folgenden Teil aus und geben Sie den Pfad entsprechend an
\# Uncomment and update the paths in these entries to build the Android demo.
android_sdk_repository(
name = "androidsdk",
api_level = 23,
build_tools_version = "25.0.1",
\# Replace with path to Android SDK on your system
path = "/home/user/Android/Sdk",
)
\#Android NDK r12b is recommended (higher may cause issues with Bazel)
android_ndk_repository(
name="androidndk",
path="/home/user/Android/Sdk/ndk-bundle",
api_level=14) \# This needs to be 14 or higher to compile TensorFlow.
Als nächstes werden wir bauen.
bazel build -c opt //tensorflow/contrib/android:libtensorflow_inference.so \
--crosstool_top=//external:android/crosstool \
--host_crosstool_top=@bazel_tools//tools/cpp:toolchain \
--cpu=armeabi-v7a
Bauen Sie mit Bazel.
--cpu=armeabi-v7a
Der Teil von
arm64-v8a x86 x86_64
Bitte wechseln Sie zu einem geeigneten.
bazel-bin/tensorflow/contrib/android/libtensorflow_inference.so
Wurde generiert.
Nächster
bazel build //tensorflow/contrib/android:android_tensorflow_inference_java
damit
bazel-bin/tensorflow/contrib/android/libandroid_tensorflow_inference_java.jar
Eine JAR-Datei wird in erstellt.
▽libs libandroid_tensorflow_inference_java.jar ▽armeabi-v7a libtensorflow_inference.so Ordnen Sie die Dateien so an in app / build.gradle
app/build.gradle
sourceSets {
main {
jniLibs.srcDirs = ['libs']
}
}
Hinzugefügt
Importieren-> Instanz erstellen-> Eingabe-> Ausführen-> Ausgabe extrahieren Es ist ein Verfahren von.
import org.tensorflow.contrib.android.TensorFlowInferenceInterface;
Wann
static {
System.loadLibrary("tensorflow_inference");
}
Sie können es durch Schreiben verwenden.
public TensorFlowInferenceInterface inferenceInterface;
inferenceInterface = new TensorFlowInferenceInterface();
Erstellen Sie eine Instanz mit usw.
inferenceInterface.initializeTensorFlow(getAssets(), "PATH_TO_MODEL");
Laden Sie das Modell aus app / src / main / assets / model.pb mit. Ändern Sie model.pb und "PATH_TO_MODEL" entsprechend Ihrer eigenen Umgebung.
inferenceInterface.fillNodeFloat("NAME_OF_INPUT", int[] shape = {1,784},float[] input);
Geben Sie Daten in das trainierte Modell mit ein "NAME_OF_INPUT" ist der Name des Platzhalters im Eingabeteil Tensorflows MNIST-Tutorial
x = tf.placeholder(tf.float32, [None, 784],name="input")
Es ist "Eingabe". In ähnlicher Weise ist int [] shape = {1,784} Teil von [None, 784]. Die Eingabe float [] ist auch die Vektorzeichenfolge, die Sie eingeben möchten, oder in MNIST die Vektorzeichenfolge handgeschriebener Zeichen. Bitte ändern Sie es entsprechend Ihrer eigenen Umgebung.
Zusätzlich zu Float für das Eingabearray inferenceInterface.fillNodeInt() inferenceInterface.fillNodeByte() Und so weiter. https://github.com/tensorflow/tensorflow/blob/master/tensorflow/contrib/android/java/org/tensorflow/contrib/android/TensorFlowInferenceInterface.java Bitte finden Sie es von hier.
inferenceInterface.runInference(String[] {"NAME_OF_OUTPUT"});
Berechnen Sie die Ausgabe aus der Eingabe mit. "NAME_OF_OUTPUT" ist Tensorflow
y_conv=tf.nn.softmax(tf.matmul(h_fc1_drop, W_fc2) + b_fc2,name="output")
Es ist ein Name wie. Da es mehrere Ausgabeebenen geben kann, ist es String [].
inferenceInterface.readNodeFloat("NAME_OF_OUTPUT", float[] output);
Empfängt die Ausgabe an der durch "NAME_OF_OUTPUT" in der float [] -Ausgabe angegebenen Position. Dies ist dasselbe wie die Eingabe, und Int und Double können auch ausgegeben werden.
Die Erklärung ist ziemlich grob und es gibt keinen Beispielcode, daher weiß ich nicht warum, also werde ich ihn nacheinander korrigieren, wenn ich Zeit habe. Ich habe Beispielcode vorbereitet, aber da es viele Teile wie den Eingabeteil gibt, den ich durch Kopieren und Einfügen erstellt habe, werde ich ihn nach der Korrektur hinzufügen, damit kein Urheberrechtsproblem auftritt.
Zum Zeitpunkt der Implementierung auf Android gibt es zu wenige offizielle Erklärungen, und ich denke, dass es Teile gibt, die ich missverstanden habe. Wenn es also Fehler gibt, kommentieren Sie diese bitte.
Recommended Posts