Addendum 3: J'ai reçu une demande de correction concernant la notation de @ 84d010m08 et je l'ai fusionnée. Merci beaucoup. Actuellement, il semble y avoir deux méthodes, Tensor Flow mobile et lite. Veuillez vous référer à cet article.
Addendum 2: Veuillez vous référer à l'explication officielle pour une explication appropriée. https://www.tensorflow.org/mobile/android_build
Post-scriptum: Le contenu de cet article est obsolète. Pour expliquer très simplement la méthode actuelle, écrivez le contenu suivant dans build.gradle.
build.gradle
allprojects {
repositories {
jcenter()
}
}
dependencies {
compile 'org.tensorflow:tensorflow-android:+'
}
Ce faisant, vous pouvez utiliser TensorFlowInferenceInterface. (Voir l'ancien article ci-dessous pour TensorFlowInferenceInterface) Les noms des méthodes ont beaucoup changé, c'est donc une bonne idée de les rechercher dans le référentiel officiel. Au moment de l'ajout, ・ Entrez avec alimentation () ・ Apprenez avec run () -Fetch sortie avec fetch () est. https://github.com/tensorflow/tensorflow/blob/master/tensorflow/contrib/android/java/org/tensorflow/contrib/android/TensorFlowInferenceInterface.java
Article avant ajout ci-dessous
Bien que certains articles aient exécuté Tensorflow sur Android, http://qiita.com/tomoima525/items/99a2df5cb0559c41647a http://qiita.com/ornew/items/cf7e4478936fbf28b271 http://qiita.com/ornew/items/cf7e4478936fbf28b271 http://qiita.com/miyosuda/items/e53ad2efeed0ff040606 Puisqu'il n'y avait pas de document japonais sur la façon d'exécuter simplement à l'aide de la classe TensorFlowInferenceInterface, c'était juste un mémo. La méthode de cet article vous permet de créer une application avec uniquement le modèle entraîné et Android Studio. Il existe de nombreux bons articles sur l'utilisation du Deep Learning et sur l'utilisation de Tensorflow, veuillez donc les rechercher.
J'écris beaucoup, donc je réglerai ça un par un quand j'aurai le temps.
Les trois suivants. 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
De la préparation des fichiers .jar et .so. Identique au contenu du document officiel ci-dessous. https://github.com/tensorflow/tensorflow/tree/master/tensorflow/contrib/android
Si tu ne veux pas mettre bazel https://ci.tensorflow.org/view/Nightly/job/nightly-android/ Il semble que vous puissiez obtenir un fichier pré-construit à partir de (non confirmé)
Tout d'abord
git clone --recurse-submodules https://github.com/tensorflow/tensorflow.git
Téléchargez la source Tensorflow sur
prochain
tensorflow/WORKSPACE
Changer à l'intérieur Décommentez la partie suivante et spécifiez le chemin de manière appropriée
\# 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.
Ensuite, nous allons construire.
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
Construisez avec bazel.
--cpu=armeabi-v7a
La partie de
arm64-v8a x86 x86_64
Veuillez changer pour un approprié.
bazel-bin/tensorflow/contrib/android/libtensorflow_inference.so
A été généré.
prochain
bazel build //tensorflow/contrib/android:android_tensorflow_inference_java
alors
bazel-bin/tensorflow/contrib/android/libandroid_tensorflow_inference_java.jar
Un fichier jar sera créé au format.
▽libs libandroid_tensorflow_inference_java.jar ▽armeabi-v7a libtensorflow_inference.so Organisez les fichiers comme ceci dans app / build.gradle
app/build.gradle
sourceSets {
main {
jniLibs.srcDirs = ['libs']
}
}
Ajoutée
Importer-> Créer une instance-> Entrée-> Exécuter-> Extraire la sortie C'est une procédure de.
import org.tensorflow.contrib.android.TensorFlowInferenceInterface;
Quand
static {
System.loadLibrary("tensorflow_inference");
}
Vous pouvez l'utiliser en écrivant.
public TensorFlowInferenceInterface inferenceInterface;
inferenceInterface = new TensorFlowInferenceInterface();
Créez une instance avec, etc.
inferenceInterface.initializeTensorFlow(getAssets(), "PATH_TO_MODEL");
Chargez le modèle depuis app / src / main / assets / model.pb avec. Modifiez model.pb et "PATH_TO_MODEL" en fonction de votre propre environnement.
inferenceInterface.fillNodeFloat("NAME_OF_INPUT", int[] shape = {1,784},float[] input);
Entrez les données dans le modèle entraîné avec "NAME_OF_INPUT" est le nom de l'espace réservé dans la partie d'entrée Tutoriel MNIST de Tensorflow
x = tf.placeholder(tf.float32, [None, 784],name="input")
C'est "entrée". De même, int [] shape = {1,784} fait partie de [None, 784]. En outre, l'entrée float [] est la chaîne vectorielle que vous souhaitez saisir, ou dans MNIST, la chaîne vectorielle de caractères manuscrits. Veuillez le modifier en fonction de votre propre environnement.
En plus de Float pour le tableau d'entrée inferenceInterface.fillNodeInt() inferenceInterface.fillNodeByte() Etc. https://github.com/tensorflow/tensorflow/blob/master/tensorflow/contrib/android/java/org/tensorflow/contrib/android/TensorFlowInferenceInterface.java Veuillez le trouver d'ici.
inferenceInterface.runInference(String[] {"NAME_OF_OUTPUT"});
Calculez la sortie de l'entrée avec. «NAME_OF_OUTPUT» est Tensorflow
y_conv=tf.nn.softmax(tf.matmul(h_fc1_drop, W_fc2) + b_fc2,name="output")
C'est un nom donné par tel que. Puisqu'il peut y avoir plusieurs couches de sortie, il s'agit de String [].
inferenceInterface.readNodeFloat("NAME_OF_OUTPUT", float[] output);
Reçoit la sortie à l'emplacement spécifié par "NAME_OF_OUTPUT" dans la sortie float []. C'est le même que l'entrée, et Int et Double peuvent également être sortis.
L'explication est assez grossière et il n'y a pas d'exemple de code, donc je ne sais pas pourquoi, donc je vais le corriger un par un quand j'aurai le temps. J'ai préparé un exemple de code, mais comme il y a de nombreuses parties telles que la partie d'entrée que j'ai créée en copiant et collant, je l'ajouterai après l'avoir corrigée afin qu'il n'y ait pas de problème de copyright.
Il y a trop peu d'explications officielles au moment de la mise en œuvre sur Android, et je pense qu'il y a des parties que j'ai mal comprises, donc s'il y a des erreurs, veuillez commenter.