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

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

Informazioni su questo codelab

subjectUltimo aggiornamento: apr 12, 2022
account_circleScritto da: Wei Wei (adapting author), Laurence Moroney (original author)

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ù