Addestra un modello di rilevamento di commenti spam con TensorFlow Lite Model Maker

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

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

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.

c42755151d511ce.png

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.

7d0ee06a5246b58d.png

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.

f063ff6e1d2add67.png

8. Esporta il modello

  1. 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])
  1. Comprimi l'intera cartella di /mm_spam_savedmodel e abbassa in basso il file mm_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.

Scopri di più