1. Prima di iniziare
In questo codelab, esamini il codice creato con TensorFlow e TensorFlow Lite Model Maker per creare un modello con un set di dati basato sullo spam nei commenti. I dati originali sono disponibili su Kaggle. Sono stati raccolti in un unico file CSV e ripuliti rimuovendo testo danneggiato, markup, parole ripetute e altro ancora. In questo modo sarà più facile concentrarsi sul modello anziché sul testo.
Il codice che esamini è fornito qui, ma ti consigliamo vivamente di seguire il codice in Colaboratory.
Prerequisiti
- Questo codelab è stato scritto per sviluppatori esperti che non hanno familiarità con il machine learning.
- Questo codelab fa parte del percorso Inizia a utilizzare la classificazione del testo nelle app Flutter. Se non hai ancora completato le attività precedenti, interrompi e fallo ora.
Obiettivi didattici
- Come installare TensorFlow Lite Model Maker con Colab.
- Come scaricare i dati dal server Colab sul tuo dispositivo.
- Come utilizzare un caricatore di dati.
- Come creare il modello.
Che cosa ti serve
- Accesso a Colab
2. Installa TensorFlow Lite Model Maker
- Apri Colab. La prima cella del blocco note installerà TensorFlow Lite Model Maker per te:
!pip install -q tflite-model-maker
Al termine, passa alla cella successiva.
3. Importa il codice
La cella successiva contiene una serie di importazioni che il codice nel notebook dovrà utilizzare:
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')
Verrà anche verificato se hai eseguito TensorFlow 2.x, che è un requisito per utilizzare Model Maker.
4. Scarica i dati
Successivamente, scarica i dati dal server Colab sul tuo dispositivo e imposta la variabile data_file
in modo che punti al file locale:
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 può addestrare modelli da semplici file CSV come questo. Devi solo specificare quali colonne contengono il testo e quali le etichette. Vedrai come farlo più avanti in questo codelab.
5. Embedding pre-appresi
In genere, quando utilizzi Model Maker, non crei modelli da zero. Utilizzi modelli esistenti che personalizzi in base alle tue esigenze.
I modelli linguistici, come questo, prevedono l'utilizzo di incorporamenti preappresi. L'idea alla base di un embedding è che le parole vengono convertite in numeri, a ogni parola del corpus complessivo viene assegnato un numero. Un incorporamento è un vettore utilizzato per determinare il sentiment di una parola stabilendo una "direzione" per la parola. Ad esempio, le parole utilizzate di frequente nei messaggi di spam nei commenti hanno i vettori che puntano in una direzione simile, mentre le parole che non lo sono hanno i vettori che puntano nella direzione opposta.
Quando utilizzi gli incorporamenti pre-appresi, puoi iniziare con un corpus, o raccolta, di parole per le quali è già stato appreso il sentiment da un grande insieme di testi, in modo da arrivare a una soluzione molto più velocemente rispetto a quando inizi da zero.
Model Maker fornisce diversi incorporamenti pre-appresi che puoi utilizzare, ma l'opzione average_word_vec
è la più semplice e veloce per iniziare.
Ecco il codice:
spec = model_spec.get('average_word_vec')
spec.num_words = 2000
spec.seq_len = 20
spec.wordvec_dim = 7
Parametro num_words
Specifichi anche il numero di parole che vuoi che il modello utilizzi.
Potresti pensare che "più ce ne sono, meglio è", ma in genere esiste un numero giusto in base alla frequenza con cui viene utilizzata ogni parola. Se utilizzi ogni parola dell'intero corpus, il modello potrebbe provare a imparare e stabilire la direzione delle parole utilizzate una sola volta. In qualsiasi corpus di testo, molte parole vengono utilizzate solo una o due volte, quindi la loro inclusione nel modello non è utile perché hanno un impatto trascurabile sul sentiment complessivo.
Puoi utilizzare il parametro num_words
per ottimizzare il modello in base al numero di parole che vuoi. Un numero inferiore potrebbe fornire un modello più piccolo e più rapido, ma potrebbe essere meno preciso perché riconosce meno parole. D'altra parte, un numero maggiore potrebbe fornire un modello più grande e più lento. È importante trovare il punto ottimale.
Parametro wordvec_dim
Il parametro wordved_dim
è il numero di dimensioni che vuoi utilizzare per il vettore di ogni parola. La regola empirica determinata dalla ricerca è che si tratta della radice quarta del numero di parole. Ad esempio, se utilizzi 2000 parole, 7 è un buon punto di partenza. Se modifichi il numero di parole che utilizzi, puoi modificare anche questo valore.
Parametro seq_len
I modelli sono generalmente molto rigidi per quanto riguarda i valori di input. Per un modello linguistico, ciò significa che può classificare frasi di una determinata lunghezza statica. Questo valore è determinato dal parametro seq_len
o dalla lunghezza della sequenza.
Quando converti le parole in numeri o token, una frase diventa una sequenza di questi token. In questo caso, il modello è addestrato per classificare e riconoscere frasi con 20 token. Se la frase è più lunga, viene troncata. Se è più breve, viene aggiunto un riempimento. Nel corpus è presente un token <PAD>
dedicato a questo scopo.
6. Utilizzare un caricatore di dati
In precedenza hai scaricato il file CSV. Ora è il momento di utilizzare un caricatore di dati per trasformare questi dati in dati di addestramento che il modello possa riconoscere:
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)
Se apri il file CSV in un editor, vedrai che ogni riga contiene solo due valori, descritti con testo nella prima riga del file. In genere, ogni voce viene considerata una colonna.
Vedrai che il descrittore della prima colonna è commenttext
e che la prima voce di ogni riga è il testo del commento. Allo stesso modo, il descrittore della seconda colonna è spam
e vedrai che la seconda voce di ogni riga è True
o False,
per indicare se il testo è considerato spam nei commenti o meno. Le altre proprietà impostano la variabile model_spec
creata in precedenza, insieme a un carattere delimitatore, che in questo caso è una virgola, poiché il file è separato da virgole. Utilizzerai questi dati per l'addestramento del modello, quindi is_Training
è impostato su True
.
Ti consigliamo di conservare una parte dei dati per testare il modello. Suddividi i dati, con il 90% per l'addestramento e il restante 10% per il test/la valutazione. Poiché lo facciamo, vogliamo assicurarci che i dati di test vengano scelti in modo casuale e non siano il 10% "inferiore" del set di dati, quindi utilizza shuffle=True
quando carichi i dati per renderli casuali.
7. Crea il modello
La cella successiva serve semplicemente a creare il modello e contiene una sola riga di codice:
# Build the model
model = text_classifier.create(train_data, model_spec=spec, epochs=50,
validation_data=test_data)
Questo codice crea un modello di classificazione del testo con Model Maker e specifica i dati di addestramento che vuoi utilizzare (come configurato nel quarto passaggio), la specifica del modello (come configurata nel quarto passaggio) e un numero di epoche, che in questo caso è 50.
Il principio di base del ML è che si tratta di una forma di corrispondenza dei pattern. Inizialmente, carica i pesi pre-addestrati per le parole e tenta di raggrupparle con una previsione di quali, se raggruppate, indicano spam e quali no. La prima volta, è probabile che la suddivisione sia equa perché il modello è solo all'inizio.
Misurerà quindi i risultati di questa epoca di addestramento ed eseguirà il codice di ottimizzazione per modificare la previsione, quindi riproverà. Questa è un'epoca. Quindi, specificando epochs=50, il "ciclo" verrà eseguito 50 volte.
Quando raggiungi la 50ª epoca, il modello segnala un livello di precisione molto più elevato. In questo caso, mostra 99%
.
I valori di precisione della convalida sono in genere leggermente inferiori a quelli di precisione dell'addestramento, perché indicano come il modello classifica i dati che non ha mai visto prima. Utilizza il 10% dei dati di test che hai messo da parte in precedenza.
8. Esporta il modello
- Esegui questa cella per specificare una directory ed esportare il modello:
model.export(export_dire='/mm_spam_savedmodel', export_format=[ExportFormat.LABEL, ExportFormat.VOCAB, ExportFormat.SAVED_MODEL])
- Comprimi l'intera cartella di
/mm_spam_savedmodel
e scarica il filemm_spam_savedmodel.zip
generato, che ti servirà nel prossimo codelab.
# 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. Complimenti
Questo codelab ti ha guidato attraverso il codice Python per creare ed esportare il modello. Ora hai un SavedModel più le etichette e il vocabolario alla fine. Nel prossimo codelab vedrai come utilizzare questo modello per iniziare a classificare i commenti spam.