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 su spam nei commenti. I dati originali sono disponibili su Kaggle. È stato raccolto in un unico file CSV e sistemato rimuovendo testo danneggiato, markup, parole ripetute e altro ancora. In questo modo, è più facile concentrarsi sul modello anziché sul testo.
Il codice esaminato è fornito qui, ma ti consigliamo vivamente di seguirlo in Colaboratory.
Prerequisiti
- Questo codelab è stato scritto per sviluppatori esperti che non hanno mai utilizzato il machine learning.
- Questo codelab fa parte del Iniziare a utilizzare la classificazione del testo nel percorso delle 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 The Colab. La prima cella del blocco note installerà il modello TensorF Low Lite:
!pip install -q tflite-model-maker
Una volta terminata, passa alla cella successiva.
3. Importa il codice
La cella successiva contiene una serie di importazioni che il codice nel blocco note 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')
Verifica anche se hai eseguito TensorFlow 2.x, che è un requisito per utilizzare Model Maker.
4. Scarica i dati
Dopodiché scarica i dati dal server Colab sul tuo dispositivo e imposta la variabile data_file
in modo che rimandi 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 le colonne che contengono il testo e le etichette, cosa che potrai fare in seguito in questo codelab.
5. Incorporamenti già appresi
In genere, quando utilizzi Model Maker, non è possibile creare modelli da zero. Utilizzi modelli esistenti che puoi personalizzare in base alle tue esigenze.
I modelli linguistici, come questo, richiedono l'utilizzo di incorporamenti precedentemente appresi. L'idea alla base di un incorporamento è che le parole vengono convertite in numeri con ogni parola presente nel corpus complessivo. Un incorporamento è un vettore che viene utilizzato per determinare il sentiment di quella parola stabilendo una "direzione". Ad esempio, i vettori di uso frequente dei messaggi di spam nei commenti hanno una direzione simile, mentre le parole che non lo sono hanno i vettori nella direzione opposta.
Quando utilizzi incorporamenti precedentemente appresi, inizi con un corpus di testo, o raccolta, di parole che hanno già appreso un sentiment da un ampio corpus di testo, in modo da arrivare a una soluzione molto più rapidamente rispetto a quando inizi da zero.
Model Maker offre diversi incorporamenti appresi che puoi utilizzare, ma l'opzione più semplice e rapida per iniziare è average_word_vec
.
Ecco il codice:
spec = model_spec.get('average_word_vec')
spec.num_words = 2000
spec.seq_len = 20
spec.wordvec_dim = 7
Il parametro num_words
Devi specificare anche il numero di parole che desideri vengano utilizzate dal modello.
Potresti pensare "più è meglio", ma in genere esiste un numero corretto sulla base della frequenza di utilizzo di ogni parola. Se utilizzi ogni parola dell'intero corpus, il modello potrebbe tentare di imparare e di definire 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 perfezionare il modello in base al numero di parole che preferisci. Un numero minore potrebbe fornire un modello più piccolo e veloce, ma potrebbe essere meno preciso perché riconosce meno parole. D'altra parte, un numero più grande potrebbe fornire un modello più grande e più lento. Trovare il punto giusto è importante.
Il parametro wordvec_dim
Il parametro wordved_dim
è il numero di dimensioni che vuoi utilizzare per il vettore per ogni parola. La regola generale determinata dalle ricerche è che è la quarta radice del numero di parole. Ad esempio, se utilizzi 2000 parole, 7 è un buon punto di partenza. Se cambi il numero di parole che utilizzi, puoi anche cambiare il numero di parole che utilizzi.
Il parametro seq_len
In genere i modelli sono molto rigidi per quanto riguarda i valori di input. Ciò significa che tale modello può classificare le frasi di una determinata lunghezza statica. Questo è 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 viene addestrato per classificare e riconoscere le frasi con 20 token. Se la frase è più lunga, viene troncata. Se è più breve, viene imbottito. Puoi vedere un token <PAD>
dedicato nel corpus utilizzato 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 trasformarlo in dati di addestramento che il modello può 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 ha solo due valori e questi vengono descritti con il testo nella prima riga del file. In genere, ogni voce viene considerata come una colonna.
Noterai che il descrittore per la 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 su ogni riga è True
o False,
per indicare se il testo è considerato commenti spam. Le altre proprietà impostano la variabile model_spec
creata in precedenza e un carattere di delimitazione, che in questo caso è una virgola come file separato da virgole. Utilizzerai questi dati per l'addestramento del modello, quindi is_Training
è impostato su True
.
Ti consigliamo di trattenere una parte dei dati per testare il modello. Suddividere i dati (90% per l'addestramento e 10% per i test e la valutazione). Dato che stiamo facendo questo, vogliamo assicurarci che i dati di test vengano scelti in modo casuale e non siano il 10% del set di dati, quindi utilizzi shuffle=True
quando carichi i dati per randomizzarli.
7. Crea il modello
La cella successiva consiste semplicemente nel creare il modello, che è una singola 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 classificatore di testo con Model Maker e specifichi i dati di addestramento che vuoi utilizzare come configurati nel quarto passaggio), la specifica del modello impostata nel quarto passaggio e una serie di periodi, che in questo caso sono 50.
Il principio di base del machine learning è che è una forma di corrispondenza per pattern. Inizialmente carica le ponderazioni preaddestrate per le parole e tenta di raggrupparle con una previsione di quali, se raggruppate, indicano lo spam e quali no. La prima volta che viene eseguito l'avvio, il modello è probabilmente suddiviso in modo uniforme perché è in fase di avvio.
Misura quindi i risultati di questo periodo di addestramento ed esegue il codice di ottimizzazione per modificare la previsione, quindi riprova. Si tratta di un periodo. Quindi, specificando il periodo=50, il passaggio verrà eseguito 50 volte.
Quando raggiungi il 50° periodo, il modello segnala un livello di precisione molto più elevato. In questo caso, 99%
!
In genere, i valori relativi alla precisione della convalida sono leggermente inferiori rispetto a quelli dell'addestramento, in quanto indicano come il modello classifica i dati mai visti prima. Utilizza i dati del test del 10% che hai precedentemente riservato.
8. Esporta il modello
- Esegui questa cella per specificare una directory ed esporta 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 abbassa in basso il filemm_spam_savedmodel.zip
generato, che ti servirà nel codelab successivo.
# 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 indirizzato al codice Python per creare ed esportare il tuo modello. Ora disponi di un Salva modello più le etichette e il vocabolario alla fine. Nel prossimo codelab scoprirai come utilizzare questo modello in modo da poter iniziare a classificare i commenti spam.