W tym samouczku pokazano, jak zbudować aplikację na Androida przy użyciu TensorFlow Lite do klasyfikowania tekstu w języku naturalnym. Ta aplikacja jest przeznaczona na fizyczne urządzenie z systemem Android, ale można ją również uruchomić na emulatorze urządzenia.
Przykładowa aplikacja wykorzystuje TensorFlow Lite do klasyfikowania tekstu jako pozytywnego lub negatywnego, korzystając z biblioteki zadań dla języka naturalnego (NL), aby umożliwić wykonanie modeli uczenia maszynowego klasyfikacji tekstu.
Jeśli aktualizujesz istniejący projekt, możesz użyć przykładowej aplikacji jako odniesienia lub szablonu. Aby uzyskać instrukcje dotyczące dodawania klasyfikacji tekstu do istniejącej aplikacji, zobacz Aktualizowanie i modyfikowanie aplikacji .
Przegląd klasyfikacji tekstu
Klasyfikacja tekstu to zadanie uczenia maszynowego polegające na przypisywaniu zestawu predefiniowanych kategorii do tekstu otwartego. Model klasyfikacji tekstu jest szkolony na korpusie tekstu w języku naturalnym, w którym słowa lub frazy są klasyfikowane ręcznie.
Wyszkolony model otrzymuje tekst jako dane wejściowe i próbuje kategoryzować tekst zgodnie z zestawem znanych klas, które miał klasyfikować. Na przykład modele w tym przykładzie akceptują fragment tekstu i określają, czy tonacja tekstu jest pozytywna, czy negatywna. Dla każdego fragmentu tekstu model klasyfikacji tekstu generuje wynik wskazujący pewność, że tekst został poprawnie sklasyfikowany jako pozytywny lub negatywny.
Aby uzyskać więcej informacji na temat sposobu generowania modeli w tym samouczku, zapoznaj się z samouczkiem Klasyfikacja tekstu za pomocą TensorFlow Lite Model Maker .
Modele i zbiór danych
W tym samouczku zastosowano modele przeszkolone przy użyciu zestawu danych SST-2 (Stanford Sentiment Treebank). SST-2 zawiera 67 349 recenzji filmów do celów szkoleniowych i 872 recenzji filmów do testów, przy czym każda recenzja jest klasyfikowana jako pozytywna lub negatywna. Modele używane w tej aplikacji zostały przeszkolone przy użyciu narzędzia TensorFlow Lite Model Maker .
Przykładowa aplikacja korzysta z następujących wstępnie wytrenowanych modeli:
Średni wektor słów (
NLClassifier
) — modułNLClassifier
biblioteki zadań klasyfikuje tekst wejściowy na różne kategorie i obsługuje większość modeli klasyfikacji tekstu.MobileBERT (
BertNLClassifier
) —BertNLClassifier
biblioteki zadań jest podobny do NLClassifier, ale jest dostosowany do przypadków, które wymagają tokenizacji Wordpiece i Zdanie poza wykresem.
Skonfiguruj i uruchom przykładową aplikację
Aby skonfigurować aplikację do klasyfikacji tekstu, pobierz przykładową aplikację z GitHub i uruchom ją za pomocą Android Studio .
Wymagania systemowe
- Android Studio w wersji 2021.1.1 (Bumblebee) lub nowszej.
- Android SDK w wersji 31 lub nowszej
- Urządzenie z systemem Android z minimalną wersją systemu operacyjnego SDK 21 (Android 7.0 - Nougat) z włączonym trybem programisty lub emulatorem Androida.
Pobierz przykładowy kod
Utwórz lokalną kopię przykładowego kodu. Użyjesz tego kodu, aby utworzyć projekt w Android Studio i uruchomić przykładową aplikację.
Aby sklonować i skonfigurować przykładowy kod:
- Sklonuj repozytorium git
git clone https://github.com/tensorflow/examples.git
- Opcjonalnie skonfiguruj instancję git tak, aby korzystała z rzadkiego pobierania, aby mieć tylko pliki dla przykładowej aplikacji klasyfikacji tekstu:
cd examples git sparse-checkout init --cone git sparse-checkout set lite/examples/text_classification/android
Zaimportuj i uruchom projekt
Utwórz projekt na podstawie pobranego przykładowego kodu, skompiluj projekt, a następnie uruchom go.
Aby zaimportować i zbudować przykładowy projekt kodu:
- Uruchom Android Studio .
- W Android Studio wybierz opcję Plik > Nowy > Importuj projekt .
- Przejdź do przykładowego katalogu kodu zawierającego plik build.gradle (
.../examples/lite/examples/text_classification/android/build.gradle
) i wybierz ten katalog. - Jeśli Android Studio zażąda synchronizacji stopniowej, wybierz OK.
- Upewnij się, że Twoje urządzenie z Androidem jest podłączone do komputera i włączony jest tryb programisty. Kliknij zieloną strzałkę
Run
.
Jeśli wybierzesz właściwy katalog, Android Studio utworzy nowy projekt i go zbuduje. Ten proces może zająć kilka minut, w zależności od szybkości komputera i tego, czy korzystałeś z Android Studio w innych projektach. Po zakończeniu kompilacji Android Studio wyświetla komunikat BUILD SUCCESSFUL
w panelu stanu wyników kompilacji .
Aby uruchomić projekt:
- W Android Studio uruchom projekt, wybierając opcję Uruchom > Uruchom… .
- Wybierz podłączone urządzenie z Androidem (lub emulator), aby przetestować aplikację.
Korzystanie z aplikacji
Po uruchomieniu projektu w Android Studio aplikacja automatycznie otworzy się na podłączonym urządzeniu lub emulatorze urządzenia.
Aby użyć klasyfikatora tekstu:
- Wpisz fragment tekstu w polu tekstowym.
- Z listy rozwijanej Delegat wybierz opcję
CPU
lubNNAPI
. - Określ model, wybierając opcję
AverageWordVec
lubMobileBERT
. - Wybierz opcję Klasyfikuj .
Aplikacja generuje wynik pozytywny i wynik negatywny . Te dwa wyniki sumują się do 1 i mierzą prawdopodobieństwo, że nastrój tekstu wejściowego będzie pozytywny lub negatywny. Wyższa liczba oznacza wyższy poziom pewności.
Masz teraz działającą aplikację do klasyfikacji tekstu. Skorzystaj z poniższych sekcji, aby lepiej zrozumieć, jak działa przykładowa aplikacja i jak zaimplementować funkcje klasyfikacji tekstu w aplikacjach produkcyjnych:
Jak działa aplikacja - Omówienie struktury i kluczowych plików przykładowej aplikacji.
Zmodyfikuj swoją aplikację - Instrukcja dodania klasyfikacji tekstu do istniejącej aplikacji.
Jak działa przykładowa aplikacja
Aplikacja korzysta z pakietu Biblioteka zadań dla języka naturalnego (NL) do implementacji modeli klasyfikacji tekstu. Obydwa modele, Average Word Vector i MobileBERT, zostały przeszkolone przy użyciu narzędzia TensorFlow Lite Model Maker . Aplikacja domyślnie działa na procesorze, z możliwością akceleracji sprzętowej przy użyciu delegata NNAPI.
Poniższe pliki i katalogi zawierają kluczowy kod dla tej aplikacji do klasyfikacji tekstu:
- TextClassificationHelper.kt — inicjuje klasyfikator tekstu i obsługuje wybór modelu i delegata.
- MainActivity.kt — implementuje aplikację, w tym wywołuje
TextClassificationHelper
iResultsAdapter
. - ResultsAdapter.kt — obsługuje i formatuje wyniki.
Zmodyfikuj swoją aplikację
W poniższych sekcjach wyjaśniono najważniejsze kroki umożliwiające zmodyfikowanie własnej aplikacji dla systemu Android w celu uruchomienia modelu pokazanego w przykładowej aplikacji. W niniejszych instrukcjach punktem odniesienia jest przykładowa aplikacja. Konkretne zmiany potrzebne w Twojej aplikacji mogą różnić się od przykładowej aplikacji.
Otwórz lub utwórz projekt na Androida
Aby wykonać pozostałe instrukcje, potrzebujesz projektu programistycznego dla systemu Android w Android Studio. Postępuj zgodnie z poniższymi instrukcjami, aby otworzyć istniejący projekt lub utworzyć nowy.
Aby otworzyć istniejący projekt programistyczny na Androida:
- W Android Studio wybierz opcję Plik > Otwórz i wybierz istniejący projekt.
Aby utworzyć podstawowy projekt programistyczny dla systemu Android:
- Postępuj zgodnie z instrukcjami w Android Studio, aby utworzyć podstawowy projekt .
Więcej informacji na temat korzystania z Android Studio znajdziesz w dokumentacji Android Studio .
Dodaj zależności projektu
We własnej aplikacji musisz dodać określone zależności projektu, aby uruchomić modele uczenia maszynowego TensorFlow Lite i uzyskać dostęp do funkcji narzędziowych, które konwertują dane, takie jak ciągi znaków, do formatu danych tensorowych, który może być przetwarzany przez używany model.
Poniższe instrukcje wyjaśniają, jak dodać wymagane zależności projektu i modułu do własnego projektu aplikacji dla systemu Android.
Aby dodać zależności modułów:
W module korzystającym z TensorFlow Lite zaktualizuj plik
build.gradle
modułu, aby uwzględnić następujące zależności.W przykładowej aplikacji zależności znajdują się w app/build.gradle :
dependencies { ... implementation 'org.tensorflow:tensorflow-lite-task-text:0.4.0' }
Projekt musi zawierać bibliotekę zadań Text (
tensorflow-lite-task-text
).Jeśli chcesz zmodyfikować tę aplikację tak, aby działała na procesorze graficznym (GPU), biblioteka GPU (
tensorflow-lite-gpu-delegate-plugin
) zapewnia infrastrukturę do uruchamiania aplikacji na GPU, a Delegate (tensorflow-lite-gpu
) zawiera listę kompatybilności. Uruchamianie tej aplikacji na GPU wykracza poza zakres tego samouczka.W Android Studio zsynchronizuj zależności projektu, wybierając: Plik > Synchronizuj projekt z plikami Gradle .
Zainicjuj modele ML
W aplikacji na Androida musisz zainicjować model uczenia maszynowego TensorFlow Lite z parametrami, zanim uruchomisz prognozy z modelem.
Model TensorFlow Lite jest przechowywany jako plik *.tflite
. Plik modelu zawiera logikę przewidywania i zazwyczaj zawiera metadane dotyczące sposobu interpretacji wyników przewidywań, takie jak nazwy klas przewidywań. Zazwyczaj pliki modeli są przechowywane w katalogu src/main/assets
projektu deweloperskiego, jak w przykładzie kodu:
-
<project>/src/main/assets/mobilebert.tflite
-
<project>/src/main/assets/wordvec.tflite
Dla wygody i czytelności kodu w przykładzie zadeklarowano obiekt towarzyszący, który definiuje ustawienia modelu.
Aby zainicjować model w aplikacji:
Utwórz obiekt towarzyszący, aby zdefiniować ustawienia modelu. W przykładowej aplikacji obiekt ten znajduje się w TextClassificationHelper.kt :
companion object { const val DELEGATE_CPU = 0 const val DELEGATE_NNAPI = 1 const val WORD_VEC = "wordvec.tflite" const val MOBILEBERT = "mobilebert.tflite" }
Utwórz ustawienia modelu, budując obiekt klasyfikatora i skonstruuj obiekt TensorFlow Lite przy użyciu
BertNLClassifier
lubNLClassifier
.W przykładowej aplikacji znajduje się to w funkcji
initClassifier
w TextClassificationHelper.kt :fun initClassifier() { ... if( currentModel == MOBILEBERT ) { ... bertClassifier = BertNLClassifier.createFromFileAndOptions( context, MOBILEBERT, options) } else if (currentModel == WORD_VEC) { ... nlClassifier = NLClassifier.createFromFileAndOptions( context, WORD_VEC, options) } }
Włącz akcelerację sprzętową (opcjonalnie)
Inicjując model TensorFlow Lite w aplikacji, należy rozważyć użycie funkcji akceleracji sprzętowej, aby przyspieszyć obliczenia predykcyjne modelu. Delegaci TensorFlow Lite to moduły oprogramowania, które przyspieszają wykonywanie modeli uczenia maszynowego przy użyciu specjalistycznego sprzętu przetwarzającego na urządzeniu mobilnym, takiego jak jednostka przetwarzania grafiki (GPU) lub jednostka przetwarzania tensor (TPU).
Aby włączyć akcelerację sprzętową w aplikacji:
Utwórz zmienną, aby zdefiniować delegata, którego będzie używać aplikacja. W przykładowej aplikacji zmienna ta znajduje się na początku TextClassificationHelper.kt :
var currentDelegate: Int = 0
Utwórz selektor delegata. W przykładowej aplikacji selektor delegata znajduje się w funkcji
initClassifier
w TextClassificationHelper.kt :val baseOptionsBuilder = BaseOptions.builder() when (currentDelegate) { DELEGATE_CPU -> { // Default } DELEGATE_NNAPI -> { baseOptionsBuilder.useNnapi() } }
Zalecane jest używanie delegatów do uruchamiania modeli TensorFlow Lite, ale nie jest to wymagane. Aby uzyskać więcej informacji na temat używania delegatów z TensorFlow Lite, zobacz Delegaty TensorFlow Lite .
Przygotuj dane do modelu
W aplikacji na Androida kod dostarcza dane do modelu w celu interpretacji, przekształcając istniejące dane, takie jak nieprzetworzony tekst, w format danych Tensor , który może być przetwarzany przez model. Dane w Tensorze przekazywane do modelu muszą mieć określone wymiary lub kształt pasujący do formatu danych używanych do uczenia modelu.
Ta aplikacja do klasyfikacji tekstu akceptuje ciąg znaków jako dane wejściowe, a modele są szkolone wyłącznie na korpusie w języku angielskim. Znaki specjalne i słowa w języku innym niż angielski są ignorowane podczas wnioskowania.
Aby dostarczyć dane tekstowe do modelu:
Upewnij się, że funkcja
initClassifier
zawiera kod delegata i modeli, jak wyjaśniono w sekcjach Inicjowanie modeli ML i Włączanie przyspieszania sprzętowego .Użyj bloku
init
, aby wywołać funkcjęinitClassifier
. W przykładowej aplikacjiinit
znajduje się w TextClassificationHelper.kt :init { initClassifier() }
Uruchom prognozy
Po zainicjowaniu obiektu BertNLClassifier lub NLClassifier w aplikacji na Androida możesz rozpocząć wprowadzanie tekstu wejściowego do modelu, aby został on sklasyfikowany jako „pozytywny” lub „negatywny”.
Aby uruchomić prognozy:
Utwórz funkcję
classify
, która użyje wybranego klasyfikatora (currentModel
) i zmierzy czas potrzebny na sklasyfikowanie tekstu wejściowego (inferenceTime
). W przykładowej aplikacji funkcjaclassify
znajduje się w TextClassificationHelper.kt :fun classify(text: String) { executor = ScheduledThreadPoolExecutor(1) executor.execute { val results: List<Category> // inferenceTime is the amount of time, in milliseconds, that it takes to // classify the input text. var inferenceTime = SystemClock.uptimeMillis() // Use the appropriate classifier based on the selected model if(currentModel == MOBILEBERT) { results = bertClassifier.classify(text) } else { results = nlClassifier.classify(text) } inferenceTime = SystemClock.uptimeMillis() - inferenceTime listener.onResult(results, inferenceTime) } }
Przekaż wyniki z
classify
do obiektu słuchacza.fun classify(text: String) { ... listener.onResult(results, inferenceTime) }
Obsługuj dane wyjściowe modelu
Po wprowadzeniu wiersza tekstu model generuje wynik przewidywania wyrażony jako wartość zmiennoprzecinkowa w zakresie od 0 do 1 dla kategorii „pozytywnych” i „negatywnych”.
Aby uzyskać wyniki prognoz z modelu:
Utwórz funkcję
onResult
dla obiektu słuchacza, która będzie obsługiwać dane wyjściowe. W przykładowej aplikacji obiekt słuchacza znajduje się w pliku MainActivity.ktprivate val listener = object : TextClassificationHelper.TextResultsListener { override fun onResult(results: List<Category>, inferenceTime: Long) { runOnUiThread { activityMainBinding.bottomSheetLayout.inferenceTimeVal.text = String.format("%d ms", inferenceTime) adapter.resultsList = results.sortedByDescending { it.score } adapter.notifyDataSetChanged() } } ... }
Dodaj funkcję
onError
do obiektu słuchacza, aby obsługiwać błędy:private val listener = object : TextClassificationHelper.TextResultsListener { ... override fun onError(error: String) { Toast.makeText(this@MainActivity, error, Toast.LENGTH_SHORT).show() } }
Gdy model zwróci zestaw wyników przewidywań, aplikacja może zastosować się do tych przewidywań, prezentując wyniki użytkownikowi lub wykonując dodatkową logikę. Przykładowa aplikacja wyświetla wyniki przewidywań w interfejsie użytkownika.
Następne kroki
- Trenuj i wdrażaj modele od podstaw dzięki klasyfikacji tekstu za pomocą samouczka TensorFlow Lite Model Maker .
- Odkryj więcej narzędzi do przetwarzania tekstu dla TensorFlow .
- Pobierz inne modele BERT na TensorFlow Hub .
- Zapoznaj się z różnymi zastosowaniami TensorFlow Lite w przykładach .
- Dowiedz się więcej o korzystaniu z modeli uczenia maszynowego w TensorFlow Lite w sekcji Modele .
- Dowiedz się więcej o wdrażaniu uczenia maszynowego w aplikacji mobilnej w Przewodniku programisty TensorFlow Lite .