1. Prima di iniziare
In questo codelab esaminerai il codice creato utilizzando TensorFlow e TensorFlow Lite Model Maker per creare un modello utilizzando un set di dati basato sullo spam nei commenti. I dati originali sono disponibili su Kaggle. È stato raccolto in un unico file CSV e ripulito rimuovendo testo danneggiato, markup, parole ripetute e altro ancora. In questo modo sarà più facile concentrarsi sul modello anziché sul testo.
Il codice che esaminerai è stato fornito qui, ma ti consigliamo vivamente di seguire il codice in Google Colab.
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 per il mobile. Se non hai ancora completato le attività precedenti, interrompi la procedura e completale ora.
Obiettivi didattici
- Come installare TensorFlow Lite Model Maker utilizzando Google Colab
- Come scaricare i dati dal server cloud sul tuo dispositivo
- Come utilizzare un caricatore di dati
- Come creare il modello
Che cosa ti serve
- Accesso a Google Colab
2. Installa TensorFlow Lite Model Maker
Apri il 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à inoltre verificato se stai eseguendo TensorFlow 2.x, che è un requisito per utilizzare Model Maker.
4. Scarica i dati
Successivamente, scaricherai i dati dal server cloud sul tuo dispositivo e imposterai 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 nel 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.
Per i modelli linguistici, come questo, ciò comporta l'utilizzo di incorporamenti preappresi. L'idea alla base di un embedding è che le parole vengono convertite in numeri e 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 avranno i vettori che puntano in una direzione simile, mentre le parole che non vengono utilizzate punteranno nella direzione opposta.
Utilizzando gli incorporamenti preappresi, puoi iniziare con un corpus, o raccolta, di parole per le quali è già stato appreso il sentiment da un ampio corpo di testo. In questo modo, potrai trovare una soluzione molto più rapidamente rispetto a quando parti da zero.
Model Maker fornisce diversi incorporamenti pre-addestrati che puoi utilizzare, ma il più semplice e veloce 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
Parametro num_words
Specificherai 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 tentare di apprendere e stabilire la direzione di parole utilizzate una sola volta. In qualsiasi corpus di testo, molte parole vengono utilizzate solo una o due volte e in genere non vale la pena utilizzarle nel modello, in quanto hanno un impatto trascurabile sul sentiment complessivo. Puoi ottimizzare il modello in base al numero di parole che vuoi utilizzare con il parametro num_words.
Un numero più piccolo potrebbe generare un modello più piccolo e veloce, ma potrebbe essere meno preciso, in quanto riconosce meno parole. Un numero più grande qui avrà un modello più grande e più lento. Trovare il punto di equilibrio è fondamentale.
Il 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, un buon punto di partenza è 7. Se modifichi il numero di parole che utilizzi, puoi modificare anche questo valore.
Il 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 lunghezza particolare e 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. Pertanto, il modello verrà addestrato (in questo caso) per classificare e riconoscere le frasi che hanno 20 token. Se la frase è più lunga, verrà troncata. Se è più breve, verrà aggiunto un riempimento. Nel corpus vedrai un token <PAD> dedicato che verrà 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 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 per la 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 model_spec che hai creato 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 durante il caricamento dei dati per renderli casuali.
7. Crea il modello
La cella successiva serve semplicemente a creare il modello ed è costituita da una sola riga di codice:
# Build the model
model = text_classifier.create(train_data, model_spec=spec, epochs=50,
validation_data=test_data)
In questo modo viene creato un modello di classificazione del testo con Model Maker e vengono specificati i dati di addestramento da utilizzare (come configurato nel passaggio 4), la specifica del modello (come configurato nel passaggio 4) e un numero di epoche, in questo caso 50.
Il principio di base del machine learning è che si tratta di una forma di corrispondenza di pattern. Inizialmente, caricherà i pesi preaddestrati per le parole e tenterà di raggrupparle con una previsione di quali, se raggruppate, indicano spam e quali no. La prima volta, è probabile che il risultato sia vicino al 50:50, poiché il modello è solo all'inizio.

Misurerà quindi i risultati e eseguirà il codice di ottimizzazione per modificare la previsione, quindi riproverà. Questo è un periodo. Quindi, specificando epochs=50, il "ciclo" verrà eseguito 50 volte.

Quando raggiungi la 50ª epoca, il modello segnalerà un livello di precisione molto più elevato. In questo caso, viene visualizzato il 99%.
Sul lato destro, vedrai i dati relativi all'accuratezza della convalida. Questi valori sono in genere leggermente inferiori all'accuratezza dell'addestramento, in quanto indicano il modo in cui il modello classifica i dati che non ha "visto" in precedenza. Utilizza il 10% dei dati di test che abbiamo messo da parte in precedenza.

8. Esporta il modello
Una volta completato l'addestramento, puoi esportare il modello.
TensorFlow addestra un modello nel proprio formato, che deve essere convertito nel formato TFLITE per essere utilizzato all'interno di un'app mobile. Model Maker gestisce questa complessità per te.
Basta esportare il modello specificando una directory:
model.export(export_dir='/mm_spam')
All'interno di questa directory, vedrai un file model.tflite. Scaricala. Ti servirà nel prossimo codelab, in cui lo aggiungerai alla tua app per Android.
Considerazioni su iOS
Il modello .tflite che hai appena esportato funziona bene per Android, perché i metadati sul modello sono incorporati al suo interno e Android Studio può leggerli.
Questi metadati sono molto importanti perché includono un dizionario di token che rappresentano le parole così come vengono riconosciute dal modello. Ricordi quando abbiamo detto che le parole diventano token e che a questi token vengono assegnati vettori per il loro sentimento? La tua app mobile dovrà conoscere questi token. Ad esempio, se "cane" è stato tokenizzato in 42 e i tuoi utenti digitano "cane" in una frase, la tua app dovrà convertire "cane" in 42 affinché il modello lo comprenda. In qualità di sviluppatore Android, avrai a disposizione una "libreria di attività TensorFlow Lite" che semplifica l'utilizzo di questa funzionalità, ma su iOS dovrai elaborare il vocabolario, quindi dovrai averlo a disposizione. Model Maker può esportarlo per te specificando il parametro export_format. Quindi, per ottenere le etichette e il vocabolario per il tuo modello, puoi utilizzare questo codice:
model.export(export_dir='/mm_spam/',
export_format=[ExportFormat.LABEL, ExportFormat.VOCAB])
9. Complimenti
Questo codelab ti ha guidato attraverso il codice Python per la creazione e l'esportazione del modello. Alla fine avrai un file .tflite.
Nel prossimo codelab vedrai come modificare l'app per Android per utilizzare questo modello, in modo da poter iniziare a classificare i commenti di spam.