1. Zanim zaczniesz
W tym ćwiczeniu w Codelabs sprawdzisz kod utworzony za pomocą TensorFlow i TensorFlow Lite Model Maker, aby utworzyć model z zestawem danych opartym na spamie w komentarzach. Oryginalne dane są dostępne na platformie Kaggle. Zostały one zebrane w jednym pliku CSV i oczyszczone z uszkodzonego tekstu, znaczników, powtarzających się słów itp. Ułatwi to skupienie się na modelu zamiast na tekście.
Kod, który sprawdzasz, jest podany tutaj, ale zdecydowanie zalecamy śledzenie kodu w Colaboratory.
Wymagania wstępne
- Te ćwiczenia z programowania są przeznaczone dla doświadczonych programistów, którzy dopiero zaczynają przygodę z uczeniem maszynowym.
- Te warsztaty są częścią ścieżki Pierwsze kroki z klasyfikacją tekstu w aplikacjach na Fluttera. Jeśli nie zostały jeszcze ukończone poprzednie działania, przerwij i wykonaj je teraz.
Czego się nauczysz
- Jak zainstalować narzędzie TensorFlow Lite Model Maker w Colab.
- Jak pobrać dane z serwera Colab na urządzenie.
- Jak używać narzędzia do wczytywania danych.
- Jak utworzyć model.
Czego potrzebujesz
- Dostęp do Colab
2. Instalowanie biblioteki TensorFlow Lite Model Maker
- Otwórz Colab. Pierwsza komórka w notatniku zainstaluje za Ciebie narzędzie TensorFlow Lite Model Maker:
!pip install -q tflite-model-maker
Gdy to zrobisz, przejdź do następnej komórki.
3. Importowanie kodu
W następnej komórce znajduje się kilka importów, których kod w notatniku będzie potrzebować:
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')
Sprawdzimy też, czy używasz TensorFlow 2.x, co jest wymagane do korzystania z Model Maker.
4. Pobierz dane
Następnie pobierz dane z serwera Colab na urządzenie i ustaw zmienną data_file
tak, aby wskazywała 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)
Model Maker może trenować modele na podstawie prostych plików CSV, takich jak ten. Wystarczy określić, które kolumny zawierają tekst, a które etykiety. Dowiesz się, jak to zrobić, w dalszej części tego laboratorium.
5. Wstępnie wyuczone wektory dystrybucyjne
Zwykle podczas korzystania z Model Maker nie tworzysz modeli od zera. Używasz istniejących modeli, które dostosowujesz do swoich potrzeb.
Modele językowe, takie jak ten, wykorzystują wcześniej wyuczone osadzanie. Ideą osadzania jest przekształcanie słów w liczby, przy czym każde słowo w całym korpusie otrzymuje liczbę. Osadzenie to wektor, który służy do określania wydźwięku danego słowa poprzez ustalenie jego „kierunku”. Na przykład wektory słów, które są często używane w wiadomościach spamowych, wskazują podobny kierunek, a wektory słów, które nie są używane w takich wiadomościach, wskazują kierunek przeciwny.
Gdy używasz wstępnie wytrenowanych wektorów, możesz zacząć od korpusu, czyli zbioru słów, które już mają przypisane do nich sentymenty na podstawie dużego zbioru tekstów. Dzięki temu możesz szybciej znaleźć rozwiązanie niż w przypadku, gdy zaczynasz od zera.
Narzędzie do tworzenia modeli udostępnia kilka wstępnie wytrenowanych osadzeń, z których możesz korzystać, ale najprostszym i najszybszym sposobem na rozpoczęcie pracy jest opcja 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
Określasz też liczbę słów, których ma używać model.
Możesz myśleć, że „im więcej, tym lepiej”, ale zwykle istnieje odpowiednia liczba słów kluczowych, która zależy od częstotliwości używania każdego z nich. Jeśli użyjesz wszystkich słów w całym korpusie, model może próbować nauczyć się kierunku słów, które są używane tylko raz. W każdym korpusie tekstowym wiele słów jest używanych tylko raz lub dwa, więc ich uwzględnienie w modelu nie jest opłacalne, ponieważ mają znikomy wpływ na ogólny wydźwięk.
Za pomocą parametru num_words
możesz dostosować model na podstawie liczby słów, które chcesz uzyskać. Mniejsza liczba może zapewnić mniejszy i szybszy model, ale może być mniej dokładny, ponieważ rozpoznaje mniej słów. Z drugiej strony większa liczba może dać większy i wolniejszy model. Ważne jest znalezienie złotego środka.
Parametr wordvec_dim
Parametr wordved_dim
to liczba wymiarów, których chcesz użyć w wektorze dla każdego słowa. Z badań wynika, że optymalna liczba słów kluczowych to czwarty pierwiastek liczby słów. Jeśli np. używasz 2000 słów, dobrym punktem wyjścia jest 7. Jeśli zmienisz liczbę używanych słów, możesz też zmienić tę wartość.
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 określonej stałej długości. Zależy to od parametru seq_len
lub długości sekwencji.
Gdy przekształcisz słowa w liczby lub tokeny, zdanie stanie się sekwencją tych tokenów. W tym przypadku model jest trenowany do klasyfikowania i rozpoznawania zdań zawierających 20 tokenów. Jeśli zdanie jest dłuższe, zostanie ucięte. Jeśli jest krótszy, jest uzupełniany. W korpusie używanym do tego celu zobaczysz specjalny token <PAD>
.
6. Używanie narzędzia do wczytywania danych
Wcześniej pobrano plik CSV. Teraz użyj narzędzia do wczytywania danych, aby przekształcić je w dane treningowe, które model może rozpoznać:
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)
Jeśli otworzysz plik CSV w edytorze, zobaczysz, że każdy wiersz zawiera tylko 2 wartości, a są one opisane tekstem w pierwszym wierszu pliku. Zwykle każdy wpis jest traktowany jako kolumna.
Zobaczysz, że opis pierwszej kolumny to commenttext
, a pierwszy wpis w każdym wierszu to tekst komentarza. Podobnie deskryptor drugiej kolumny to spam
, a drugi wpis w każdym wierszu to True
lub False,
, co oznacza, czy tekst jest uważany za spam w komentarzach. Pozostałe właściwości ustawiają utworzoną wcześniej zmienną model_spec
wraz ze znakiem rozdzielającym, którym w tym przypadku jest przecinek, ponieważ plik jest rozdzielany przecinkami. Użyjesz tych danych do trenowania modelu, więc is_Training
jest ustawione na True
.
Część danych należy zachować na potrzeby testowania modelu. Podziel dane tak, aby 90% z nich służyło do trenowania, a pozostałe 10% do testowania lub oceny. W tym celu chcemy mieć pewność, że dane testowe są wybierane losowo, a nie stanowią „dolnych” 10% zbioru danych. Dlatego podczas wczytywania danych użyj funkcji shuffle=True
, aby je losowo uporządkować.
7. Tworzenie modelu
W kolejnej komórce wystarczy utworzyć model. Jest to jeden wiersz kodu:
# Build the model
model = text_classifier.create(train_data, model_spec=spec, epochs=50,
validation_data=test_data)
Ten kod tworzy model klasyfikatora tekstu za pomocą narzędzia Model Maker. Określasz w nim dane treningowe, których chcesz użyć (skonfigurowane w kroku 4), specyfikację modelu (skonfigurowaną w kroku 4) i liczbę epok, która w tym przypadku wynosi 50.
Podstawową zasadą uczenia maszynowego jest dopasowywanie wzorców. Początkowo wczytuje wstępnie wytrenowane wagi słów i próbuje je pogrupować, przewidując, które z nich po zgrupowaniu wskazują na spam, a które nie. Za pierwszym razem prawdopodobnie będzie równomiernie podzielony, ponieważ model dopiero zaczyna działać.
Następnie zmierzy wyniki tej epoki trenowania i uruchomi kod optymalizacji, aby dostosować prognozę, a potem spróbuje ponownie. To jest epoka. Jeśli więc określisz epochs=50, pętla zostanie wykonana 50 razy.
Po 50 epokach model wykazuje znacznie wyższy poziom dokładności. W tym przypadku wyświetla się 99%
.
Wartości dokładności weryfikacji są zwykle nieco niższe niż dokładności trenowania, ponieważ wskazują, jak model klasyfikuje dane, których wcześniej nie widział. Wykorzystuje ona 10% danych testowych, które zostały wcześniej odłożone.
8. Eksportowanie modelu
- Uruchom tę komórkę, aby określić katalog i wyeksportować model:
model.export(export_dire='/mm_spam_savedmodel', export_format=[ExportFormat.LABEL, ExportFormat.VOCAB, ExportFormat.SAVED_MODEL])
- Skompresuj cały folder
/mm_spam_savedmodel
i pobierz wygenerowany plikmm_spam_savedmodel.zip
, który będzie potrzebny w następnych ćwiczeniach z kodowania.
# Rename the SavedModel subfolder to a version number
!mv /mm_spam_savedmodel/saved_model /mm_spam_savedmodel/123
!zip -r mm_spam_savedmodel.zip /mm_spam_savedmodel/
9. Gratulacje
W tym ćwiczeniu pokazaliśmy, jak za pomocą kodu w Pythonie utworzyć i wyeksportować model. Teraz masz SavedModel oraz etykiety i słownictwo na końcu. W następnym ćwiczeniu w Codelabs dowiesz się, jak używać tego modelu, aby zacząć klasyfikować spam w komentarzach.