1. Zanim zaczniesz
W ramach tego ćwiczenia w Codelabs dowiesz się, jak sprawdzić kod utworzony za pomocą TensorFlow i TensorFlow Lite Model Maker, aby utworzyć model za pomocą zbioru danych bazującego na spamie w komentarzach. Oryginalne dane są dostępne w kaggle. Zebrano go w pojedynczy plik CSV i wyczyściliśmy przez usunięcie uszkodzonego tekstu, znaczników, powtórzonych słów i innych elementów. Ułatwi to skupienie się na modelu zamiast na tekście.
Kod, który będziesz sprawdzać, przekazaliśmy tutaj, ale zdecydowanie zalecamy postępowanie zgodnie z tym kodem w Google Colab.
Wymagania wstępne
- To ćwiczenie w Codelabs zostało stworzone z myślą o doświadczonych programistach, którzy dopiero zaczynają korzystać z systemów uczących się.
- To ćwiczenie w Codelabs jest częścią ścieżki Pierwsze kroki z klasyfikacją tekstu w aplikacjach mobilnych. Jeśli nie udało Ci się jeszcze ukończyć poprzednich zadań, zrób to teraz.
Czego się nauczysz
- Jak zainstalować Kreator modeli TensorFlow Lite za pomocą Google Colab
- Jak pobrać dane z serwera Google Cloud na urządzenie
- Jak korzystać z programu wczytującego dane
- Jak utworzyć model
Czego potrzebujesz
- Dostęp do Google Colab
2. Instalowanie Kreatora modeli TensorFlow Lite
Otwórz Colab. Pierwsza komórka w notatniku spowoduje zainstalowanie Kreatora modeli TensorFLow Lite:
!pip install -q tflite-model-maker
Gdy skończysz, przejdź do następnej komórki.
3. Zaimportuj kod
Następna komórka zawiera szereg importów, których będzie musiał użyć kod w notatniku:
import numpy as np
import os
from tflite_model_maker import configs
from tflite_model_maker import ExportFormat
from tflite_model_maker import model_spec
from tflite_model_maker import text_classifier
from tflite_model_maker.text_classifier import DataLoader
import tensorflow as tf
assert tf.__version__.startswith('2')
tf.get_logger().setLevel('ERROR')
Spowoduje to również sprawdzenie, czy korzystasz z TensorFlow 2.x, który jest wymagany do korzystania z Kreatora modeli.
4. Pobierz dane
Następnie pobierz dane z serwera Google Cloud na swoje urządzenie i ustaw data_file
tak, by wskazywał plik lokalny:
data_file = tf.keras.utils.get_file(fname='comment-spam.csv',
origin='https://storage.googleapis.com/laurencemoroney-blog.appspot.com/lmblog_comments.csv',
extract=False)
Kreator modeli umożliwia trenowanie modeli na podstawie prostych plików CSV, takich jak ten. Musisz tylko określić, które kolumny zawierają tekst, a które etykiety. W dalszej części tego ćwiczenia dowiesz się, jak to zrobić.
5. Wektory dystrybucyjne wyuczone
Ogólnie rzecz biorąc, w Kreatorze modeli nie trzeba tworzyć modeli od podstaw. Korzystasz z istniejących modeli, które możesz dostosowywać do swoich potrzeb.
W przypadku modeli językowych, takich jak ten, konieczne jest użycie wstępnie wyuczonych wektorów dystrybucyjnych. Metodą wektora dystrybucyjnego jest fakt, że słowa są konwertowane na liczby, a każde słowo w ogólnym korpusie otrzymuje liczbę. Umieszczanie to wektor, który służy do określania nastawienia słowa przez ustalenie „kierunku”. danego słowa. Na przykład słowa często występujące w spamerskich wiadomościach w komentarzach będą miały wektory wskazujące podobny kierunek, a wyrazy niewystarczające – w przeciwnym kierunku.
Użycie wstępnie wyuczonych wektorów dystrybucyjnych pozwala rozpocząć od korpusu, czyli zbioru słów, które już zostały dobrze nauczone na podstawie dużego tekstu. W ten sposób dotrzesz do rozwiązania znacznie szybciej niż zaczynając od zera.
Kreator modeli udostępnia kilka wstępnie wyuczonych wektorów dystrybucyjnych, których możesz użyć, ale najprostszym i najszybszym rozwiązaniem jest average_word_vec
.
Oto kod:
spec = model_spec.get('average_word_vec')
spec.num_words = 2000
spec.seq_len = 20
spec.wordvec_dim = 7
Parametr num_words
Możesz także określić liczbę słów, których model ma używać.
Możesz pomyśleć: „im więcej, tym lepiej”, ale zwykle istnieje odpowiednia liczba, która zależy od częstotliwości występowania poszczególnych słów. Jeśli użyjesz każdego słowa w całym korpusie, model może spróbować nauczyć się i określić kierunek słów, które zostały użyte tylko raz. W każdym korpusie tekstowym zobaczysz, że wiele słów jest używanych tylko 1 lub 2 razy. Ogólnie nie warto ich używać w modelu, ponieważ mają one znikomy wpływ na ogólne nastawienie. Możesz dostroić model na dowolną liczbę słów za pomocą parametru num_words
.
Mniejsza liczba oznacza mniejszy i szybszy model, ale może być mniej dokładny, ponieważ rozpoznaje mniej słów. Im większa liczba, tym większy i wolniejszy model. Najważniejsze jest znalezienie złotego środka.
Parametr wordvec_dim
Parametr wordved_dim
to liczba wymiarów, których chcesz użyć w przypadku każdego słowa. Zgodnie z ogólną zasadą badania stanowi czwarty pierwiastek z liczby słów. Jeśli np. używasz 2000 słów, dobrym punktem wyjścia jest 7 słów. Możesz też zmienić liczbę używanych słów.
Parametr seq_len
Modele są zwykle bardzo sztywne, jeśli chodzi o wartości wejściowe. W przypadku modelu językowego oznacza to, że może on klasyfikować zdania o konkretnej, statycznej długości. Jest on określony przez parametr seq_len
lub długość sekwencji.
Gdy zamienisz słowa w liczby (lub tokeny), zdanie stanie się sekwencją tych tokenów. Twój model zostanie więc wytrenowany (w tym przypadku) do klasyfikowania i rozpoznawania zdań z 20 tokenami. Jeśli zdanie jest dłuższe, zostanie skrócone. Jeśli będzie krótszy, zostanie dopełnieniem. W korpusie zobaczysz specjalny token <PAD>
, który zostanie do tego użyty.
6. Korzystanie z programu wczytującego dane
Wcześniej pobrałeś(-aś) plik CSV. Teraz trzeba skorzystać z programu wczytującego dane, aby przekształcić te dane w dane treningowe, które model rozpoznaje:
data = DataLoader.from_csv(
filename=data_file,
text_column='commenttext',
label_column='spam',
model_spec=spec,
delimiter=',',
shuffle=True,
is_training=True)
train_data, test_data = data.split(0.9)
Po otwarciu pliku CSV w edytorze zobaczysz, że każdy wiersz ma tylko 2 wartości, które są opisane w pierwszym wierszu pliku. Zwykle każdy wpis jest następnie uznawany za kolumnę.
Deskryptor pierwszej kolumny to commenttext
, a pierwszy wpis w każdym wierszu to tekst komentarza. I podobnie, deskryptor drugiej kolumny to spam
. Zobaczysz też, że druga pozycja w każdym wierszu ma wartość True
lub False,
, która wskazuje, czy ten tekst jest uznawany za spam w komentarzach. Inne właściwości ustawiają utworzone wcześniej pole model_spec
wraz ze znakiem separatora, czyli w tym przypadku przecinkiem, ponieważ plik jest rozdzielany przecinkami. Wykorzystasz te dane do trenowania modelu, więc parametr is_Training
ma wartość True
.
Aby przetestować model, musisz wstrzymać część danych. Podziel dane, pozostałe 90% do trenowania, a pozostałe 10% do testowania/oceny. Chcemy mieć pewność, że dane testowe są wybierane losowo, a nie na samym dole. 10% zbioru danych, więc do losowego generowania danych używasz parametru shuffle=True
.
7. Zbuduj model
Następna komórka to utworzenie modelu, który zawiera pojedynczy wiersz kodu:
# Build the model
model = text_classifier.create(train_data, model_spec=spec, epochs=50,
validation_data=test_data)
W ten sposób w Kreatorze modeli powstanie model klasyfikatora tekstu. Musisz wtedy określić dane treningowe, których chcesz użyć (konfigurowane w kroku 4), specyfikację modelu (zgodnie z konfiguracją w kroku 4) oraz liczbę epok, w tym przypadku 50.
Podstawową zasadą uczenia maszynowego jest to, że jest to forma dopasowywania wzorców. Początkowo wczytuje on wytrenowane wagi dla słów i próbuje pogrupować je razem z prognozą, które z nich, po zgrupowaniu, wskazują na spam, a które nie. Za pierwszym razem będzie to prawdopodobnie około 50:50, ponieważ model dopiero się zaczyna.
Następnie zmierzy wyniki i uruchomi kod optymalizacji w celu ulepszenia prognozy, a następnie spróbuje ponownie. Oto epoka. Dlatego określenie epok=50 powoduje przejście przez tę „pętlę”. 50 razy.
Gdy osiągniesz 50 epokę, model wykaże znacznie większą dokładność. W tym przypadku pokazujemy 99%.
Po prawej stronie zobaczysz wartości dokładności weryfikacji. Będą one zwykle nieco niższe niż dokładność trenowania, ponieważ wskazują, jak model klasyfikuje dane, których wcześniej nie „widziło”. Wykorzystywane są w nim 10-procentowe dane testowe, które zapisaliśmy wcześniej.
8. Eksportowanie modelu
Po zakończeniu trenowania możesz wyeksportować model.
TensorFlow trenuje model we własnym formacie, który trzeba przekonwertować na format TFLITE, aby można było go używać w aplikacji mobilnej. Kreator modeli zajmie się tą złożonością za Ciebie.
Wystarczy, że wyeksportujesz model, podając katalog:
model.export(export_dir='/mm_spam')
W tym katalogu zobaczysz plik model.tflite
. Pobierz. Będzie Ci potrzebne w następnym ćwiczeniu z programowania, gdzie dodasz je do aplikacji na Androida.
Uwagi na temat iOS
Wyeksportowany przed chwilą model .tflite dobrze działa na Androidzie, ponieważ są w nim umieszczone metadane modelu i Android Studio może je odczytać.
Te metadane są bardzo ważne, ponieważ zawierają słownik tokenów reprezentujących słowa, które są rozpoznawane przez model. Pamiętasz to z wcześniejszej wiadomości, z której dowiedzieliśmy się, że słowa są tokenami, a tokeny otrzymują wektory określające ich uczucia. Twoja aplikacja mobilna musi znać te tokeny. Na przykład: jeśli „pies” została tokenizowana do 42, a użytkownicy wpisują „pies” w zdaniu, aplikacja będzie musiała przekonwertować słowo „pies”. do 42, aby model mógł go zrozumieć. Jako programista aplikacji na Androida masz „bibliotekę zadań TensorFlow Lite” co ułatwia korzystanie z tej funkcji, ale w systemie iOS trzeba przetwarzać słownictwo, więc musisz mieć go pod ręką. Kreator modeli może to wyeksportować za Ciebie, określając parametr export_format
. Aby uzyskać etykiety i słownictwo używane na potrzeby modelu, możesz użyć następującego kodu:
model.export(export_dir='/mm_spam/',
export_format=[ExportFormat.LABEL, ExportFormat.VOCAB])
9. Gratulacje
Dzięki tym ćwiczeniom w Codelabs omówiliśmy kod w Pythonie, który pozwoli Ci utworzyć i wyeksportować model. Na końcu znajdziesz plik .tflite.
Z następnego ćwiczenia w Codelabs dowiesz się, jak edytować aplikację na Androida, aby używać tego modelu, co pozwoli Ci zacząć klasyfikować komentarze ze spamem.