Cum se utilizează TensorFlow Mobile în aplicațiile Android

Cu TensorFlow, unul dintre cele mai populare cadre de învățare automată disponibile astăzi, puteți să creați cu ușurință și să pregătiți modele adânci - de asemenea, denumite în mod obișnuit rețele neuronale de alimentare avansată - care pot rezolva o varietate de probleme complexe, cum ar fi clasificarea imaginilor, detectarea și înțelegerea limbajului natural. TensorFlow Mobile este o bibliotecă concepută pentru a vă ajuta să folosiți aceste modele în aplicațiile dvs. mobile.

În acest tutorial, vă vom arăta cum să utilizați TensorFlow Mobile în proiectele Android Studio.

Cerințe preliminare

Pentru a putea urma acest tutorial, veți avea nevoie de:

  • Android Studio 3.0 sau o versiune ulterioară
  • TensorFlow 1.5.0 sau mai mare
  • un dispozitiv Android care rulează nivelul API 21 sau superior
  • și o înțelegere de bază a cadrului TensorFlow

1. Crearea unui model

Înainte de a începe să folosim TensorFlow Mobile, avem nevoie de un model TensorFlow instruit. Să creăm una acum.

Modelul nostru va fi foarte simplu. Se va comporta ca o poartă XOR, luând două intrări, ambele putând fi zero sau una și producând o ieșire care va fi zero dacă ambele intrări sunt identice și altul. În plus, pentru că va fi un model profund, va avea două straturi ascunse, unul cu patru neuroni și altul cu trei neuroni. Sunteți liber să modificați numărul de straturi ascunse și numărul de neuroni pe care îi conțin.

Pentru a păstra scurt acest tutorial, în loc să folosim direct API-urile TensorFlow de nivel inferior, vom folosi TFLearn, un cadru popular pentru TensorFlow care oferă API-uri mai intuitive și mai concise. Dacă nu îl aveți deja, utilizați următoarea comandă pentru ao instala în interiorul mediul virtual TensorFlow:

pip install tflearn

Pentru a începe crearea modelului, creați un script Python numit create_model.py, de preferință într-un director gol, și deschideți-l cu editorul dvs. de text preferat.

În interiorul fișierului, primul lucru pe care trebuie să-l facem este importul API-urilor TFLearn.

import tflearn

Apoi, trebuie să creăm datele de antrenament. Pentru modelul nostru simplu, vor exista doar patru intrări și ieșiri posibile, care se vor asemăna cu conținutul tabelului de adevăr al porții XOR.

X = [[0, 0], [0, 1], [1, 0], [1, 1]] Y = intrări 0, 1 [1], # Ieșire dorită pentru intrări 1, 0 [0] # Ieșire dorită pentru intrările 1, 1]

Este de obicei o idee bună să folosiți valori aleatorii alese dintr-o distribuție uniformă, în timp ce alocați greutățile inițiale tuturor neuronilor din straturile ascunse. Pentru a genera valorile, utilizați uniformă() metodă.

greutăți = tflearn.initializations.uniform (minval = -1, maxval = 1)

În acest moment, putem începe să creăm straturile rețelei noastre neuronale. Pentru a crea stratul de intrare, trebuie să folosim date de intrare() , care ne permite să specificăm numărul de intrări pe care le poate accepta rețeaua. Odată ce stratul de intrare este gata, putem apela fully_connected () de mai multe ori pentru a adăuga mai multe straturi în rețea.

# Nivelul de intrare net = tflearn.input_data (shape = [None, 2], name = 'my_input') # Straturi ascunse net = tflearn.fully_connected (net, 4, activation = 'sigmoid', weights_init = weights) net = tflearn. (net, 1, activation = 'sigmoid', weights_init = weights, name = 'my_output').

Rețineți că în codul de mai sus am furnizat nume semnificative straturilor de intrare și de ieșire. Acest lucru este important deoarece avem nevoie de ele în timp ce folosim rețeaua din aplicația Android. De asemenea, rețineți că straturile ascunse și cele de ieșire folosesc sigmoid funcție de activare. Sunteți liber să experimentați alte funcții de activare, cum ar fi SOFTmaxtanh, și relu.

Ca ultimul strat al rețelei noastre, trebuie să creăm un strat de regresie folosind regresie () funcția care așteaptă câțiva hiper-parametri ca argumente, cum ar fi rata de învățare a rețelei și funcțiile de optimizare și pierdere pe care ar trebui să le utilizeze. Următorul cod vă arată cum să utilizați coborârea stochastică a gradientului, SGD pe scurt, ca funcție optimizator și medie pătrat ca funcție de pierdere:

net = tflearn.regiune (net, learning_rate = 2, optimizer = 'sgd', loss = 'mean_square')

În continuare, pentru a permite cadrului TFLearn să știe că modelul nostru de rețea este de fapt un model de rețea neurală profundă, trebuie să sunăm DNN () funcţie.

model = tflearn.DNN (net)

Modelul este acum gata. Tot ce trebuie să facem acum este trenul folosind datele de antrenament pe care le-am creat mai devreme. Deci, apelați potrivi() metoda modelului și, împreună cu datele de antrenament, specifică numărul de epoci de antrenament care urmează să fie difuzate. Deoarece datele de formare sunt foarte mici, modelul nostru va avea nevoie de mii de epoci pentru a obține o precizie rezonabilă.

model.fit (X, Y, 5000)

Odată ce antrenamentul este complet, putem apela prezice() metoda modelului pentru a verifica dacă generează ieșirile dorite. Următorul cod vă arată cum să verificați ieșirile pentru toate intrările valide:

imprimare ("1 XOR 1 =% f"% model.predict ([[1,1] ]) element (0)) imprimare ("0 XOR 1 =% f"% model.predict ([[0,1]]). prezice ([[0,0]]). item (0))

Dacă rulați scriptul Python acum, ar trebui să vedeți ieșirea care arată astfel:

Rețineți că ieșirile nu sunt niciodată exact 0 sau 1. În schimb, ele sunt numere în virgulă mobilă care sunt fie aproape de zero, fie aproape de una. Prin urmare, în timp ce utilizați ieșirile, este posibil să doriți să utilizați Python's rundă() funcţie.

Dacă nu salvăm în mod explicit modelul după ce l-am pregătit, îl vom pierde imediat ce scenariul se va încheia. Din fericire, cu TFLearn, un simplu apel către Salvați() metoda salvează modelul. Cu toate acestea, pentru a putea utiliza modelul salvat cu TensorFlow Mobile, înainte de ao salva, trebuie să ne asigurăm că eliminăm toate operațiile legate de instruire, care sunt prezente în tf.GraphKeys.TRAIN_OPS colectare, asociate cu acesta. Următorul cod vă arată cum să faceți acest lucru:

# Eliminați opțiunile de tren cu net.graph.as_default (): del tf.get_collection_ref (tf.GraphKeys.TRAIN_OPS) [:] # Salvați modelul model.save ('xor.tflearn')

Dacă rulați scriptul din nou, veți vedea că acesta generează un fișier de control, un fișier de metadate, un fișier index și un fișier de date, toate acestea fiind folosite simultan pentru a recrea rapid modelul nostru instruit.

2. Înghețarea modelului

Pe lângă salvarea modelului, trebuie să îl înghețăm înainte de al putea folosi cu TensorFlow Mobile. Procesul de înghețare a unui model, așa cum probabil ați ghicit, implică convertirea tuturor variabilelor sale în constante. În plus, un model înghețat trebuie să fie un singur fișier binar care să fie conform formatului de serializare Google Buffers Protocol.

Creați un nou script Python numit freeze_model.py și deschideți-l folosind un editor de text. Vom scrie tot codul pentru a îngheța modelul nostru în interiorul acestui fișier.

Deoarece TFLearn nu are funcții pentru modelele de înghețare, va trebui să folosim API-urile TensorFlow direct acum. Importați-le adăugând următoarea linie în fișier:

import tensorflow ca tf

Pe parcursul scenariului, vom folosi o singură sesiune TensorFlow. Pentru a crea sesiunea, utilizați constructorul Sesiune clasă.

cu sesiunea tf.Session () ca sesiune: # Restul codului merge aici

În acest moment, trebuie să creați o Saver obiect apelând import_meta_graph () funcția și trecând numele fișierului de metadate al modelului. În plus față de returnarea a Saver obiect, import_meta_graph () funcția adaugă automat definiția grafică a modelului la definiția grafică a sesiunii.

Odată ce sa creat economizorul, putem inițializa toate variabilele prezente în definiția graficului prin apelarea restabili() , care așteaptă calea directorului care conține ultimul fișier de control al modelului.

my_saver = tf.train.import_meta_graph ('xor.tflearn.meta') my_saver.restore (sesiune, tf.train.latest_checkpoint ('.'))

În acest moment, putem apela convert_variables_to_constants () pentru a crea o definiție a graficului înghețat unde toate variabilele modelului sunt înlocuite cu constante. Ca intrări, funcția așteaptă sesiunea curentă, definiția grafică a sesiunii curente și o listă care conține numele straturilor de ieșire ale modelului.

frozen_graph = tf.graph_util.convert_variables_to_constants (sesiune, session.graph_def, ['my_output / sigmoid'])

Apelarea SerializeToString () Metoda de definire a graficului înghețat ne oferă o reprezentare binară protobuf a modelului. Prin utilizarea facilităților de I / O ale fișierelor de bază ale Python, vă sugerez să le salvați ca fișier numit frozen_model.pb.

cu deschise ('frozen_model.pb', 'wb') ca f: f.write (frozen_graph.SerializeToString ())

Puteți rula scriptul acum pentru a genera modelul înghețat.

Avem tot ce avem nevoie pentru a începe să folosim TensorFlow Mobile.

3. Instalarea Proiectului Android Studio

Biblioteca TensorFlow Mobile este disponibilă pe JCenter, astfel încât să o putem adăuga în mod direct punerea în aplicare dependența în aplicaţia ale modulului build.gradle fişier.

implementare 'org.tensorflow: tensorflow-android: 1.7.0'

Pentru a adăuga modelul înghețat la proiect, plasați frozen_model.pb fișier în proiect bunuri pliant.

4. Inițializarea interfeței TensorFlow

TensorFlow Mobile oferă o interfață simplă pe care o putem folosi pentru a interacționa cu modelul nostru înghețat. Pentru a crea interfața, utilizați constructorul TensorFlowInferenceInterface clasa, care se așteaptă AssetManager exemplu și numele fișierului modelului înghețat.

thread val tfInterface = TensorFlowInferenceInterface (active, "frozen_model.pb") // Mai mult cod aici

În codul de mai sus, puteți vedea că vom da naștere unui fir nou. Procedând astfel, deși nu este întotdeauna necesar, este recomandat pentru a vă asigura că interfața UI a aplicației rămâne receptivă.

Pentru a vă asigura că TensorFlow Mobile a reușit să citească corect fișierul modelului nostru, să încercăm acum să tipărim numele tuturor operațiilor prezente în graficul modelului. Pentru a obține o referință la grafic, putem folosi grafic() metoda de interfață, și pentru a obține toate operațiunile, operațiuni () metoda graficului. Următorul cod vă arată cum:

val graph = tfInterface.graph () graph.operations (). pentru fiecare println (it.name ())

Dacă rulați aplicația acum, ar trebui să puteți vedea peste o duzină de nume de operațiuni tipărite în Android Studio logcat fereastră. Dintre toate aceste nume, dacă nu există erori în timpul înghețării modelului, veți putea găsi numele straturilor de intrare și de ieșire: my_input / X și my_output / sigmoid.

5. Utilizarea modelului

Pentru a face predicții cu modelul, trebuie să punem datele în stratul de intrare și să preluăm datele din stratul său de ieșire. Pentru a pune datele în stratul de intrare, utilizați a hrani() metoda interfeței, care așteaptă numele stratului, o matrice care conține intrările și dimensiunile matricei. Următorul cod vă arată modul de trimitere a numerelor 0 și 1 la stratul de intrare:

tfInterface.feed ("my_input / X", floatArrayOf (0f, 1f), 1, 2)

După încărcarea datelor în stratul de intrare, trebuie să executăm o operație de inferență folosind alerga() , care așteaptă numele stratului de ieșire. Odată ce operația este completă, stratul de ieșire va conține predicția modelului. Pentru a încărca predicția într-o matrice Kotlin, putem folosi funcția fetch () metodă. Următorul cod vă arată cum să faceți acest lucru:

tfInterface.run (arrayOf ("my_output / sigmoid")) val ieșire = floatArrayOf (-1f) tfInterface.fetch ("my_output / Sigmoid"

Modul în care utilizați această previziune este, bineînțeles, la latitudinea dvs. Pentru moment, vă sugerez să o imprimați pur și simplu.

println ("Ieșirea este $ output [0]")

Puteți rula aplicația acum pentru a vedea că prezicerea modelului este corectă.

Simțiți-vă liber să modificați numerele pe care le alimentați la stratul de intrare pentru a confirma că predicțiile modelului sunt întotdeauna corecte.

Concluzie

Acum știți cum să creați un model simplu TensorFlow și să îl utilizați cu TensorFlow Mobile în aplicațiile Android. Nu trebuie întotdeauna să te limitezi la propriile tale modele. Cu abilitățile pe care le-ați învățat astăzi, nu ar trebui să aveți probleme cu modelele mai mari, cum ar fi MobileNet și Inception, disponibile în grădina zoologică TensorFlow. Rețineți, totuși, că astfel de modele vor conduce la fișiere APK mai mari, ceea ce ar putea crea probleme pentru utilizatorii cu dispozitive low-end.

Pentru a afla mai multe despre TensorFlow Mobile, consultați documentația oficială.

Cod