TensorFlow.js: reimpostare un modello di rilevamento di commenti spam per gestire i casi limite

1. Prima di iniziare

Questo codelab è progettato per basarsi sul risultato finale del codelab precedente di questa serie per il rilevamento dello spam nei commenti utilizzando TensorFlow.js.

Nell'ultimo codelab hai creato una pagina web completamente funzionante per un blog video fittizio. Potevi filtrare i commenti per spam prima che venissero inviati al server per l'archiviazione o ad altri client connessi utilizzando un modello di rilevamento dello spam nei commenti preaddestrato basato su TensorFlow.js nel browser.

Il risultato finale di questo codelab è mostrato di seguito:

a4511e5d445706b1.gif

Sebbene questo metodo funzioni molto bene, ci sono casi limite da esplorare che non è in grado di rilevare. Puoi riaddestrare il modello per tenere conto delle situazioni che non è stato in grado di gestire.

Questo codelab si concentra sull'utilizzo dell'elaborazione del linguaggio naturale (l'arte di comprendere il linguaggio umano con un computer) e mostra come modificare un'app web esistente che hai creato (ti consigliamo vivamente di seguire i codelab in ordine) per affrontare il problema molto reale dello spam nei commenti, che molti sviluppatori web incontreranno sicuramente mentre lavorano a una delle app web più popolari esistenti oggi.

In questo codelab farai un ulteriore passo avanti eseguendo il retraining del modello di ML per tenere conto delle modifiche ai contenuti dei messaggi di spam che potrebbero evolvere nel tempo, in base alle tendenze attuali o agli argomenti di discussione più popolari, in modo da mantenere il modello aggiornato e tenere conto di queste modifiche.

Prerequisiti

  • Hai completato il primo codelab di questa serie.
  • Conoscenza di base delle tecnologie web, tra cui HTML, CSS e JavaScript.

Cosa creerai

Riutilizzerai il sito web creato in precedenza per un blog video fittizio con una sezione dei commenti in tempo reale e lo aggiornerai per caricare una versione del modello di rilevamento dello spam addestrato personalizzato utilizzando TensorFlow.js, in modo che funzioni meglio nei casi limite in cui in precedenza non avrebbe funzionato. Naturalmente, in qualità di sviluppatori e ingegneri web, potete modificare questa UX ipotetica per riutilizzarla su qualsiasi sito web su cui lavorate nei vostri ruoli quotidiani e adattare la soluzione a qualsiasi caso d'uso del cliente, ad esempio un blog, un forum o una forma di CMS, come Drupal.

Iniziamo a hackerare…

Cosa imparerai a fare

Imparerai a:

  • Identificare i casi limite in cui il modello preaddestrato non funzionava
  • Esegui il retraining del modello di classificazione spam creato utilizzando Model Maker.
  • Esporta questo modello basato su Python nel formato TensorFlow.js per utilizzarlo nei browser.
  • Aggiorna il modello ospitato e il relativo dizionario con quello appena addestrato e controlla i risultati.

Per questo lab è richiesta familiarità con HTML5, CSS e JavaScript. Eseguirai anche del codice Python tramite un notebook "co lab" per eseguire il retraining del modello creato utilizzando Model Maker, ma non è necessaria alcuna familiarità con Python per farlo.

2. Configurare l'ambiente di programmazione

Ancora una volta utilizzerai Glitch.com per ospitare e modificare l'applicazione web. Se non hai ancora completato il codelab sui prerequisiti, puoi clonare il risultato finale qui come punto di partenza. Se hai domande sul funzionamento del codice, ti consigliamo vivamente di completare il codelab precedente, che illustra come creare questa app web funzionante, prima di continuare.

Su Glitch, fai clic sul pulsante Remixa per creare una copia e un nuovo insieme di file che puoi modificare.

3. Scopri i casi limite nella soluzione precedente

Se apri il sito web completato che hai appena clonato e provi a digitare alcuni commenti, noterai che la maggior parte delle volte funziona come previsto, bloccando i commenti che sembrano spam e consentendo le risposte legittime.

Tuttavia, se ti ingegni e provi a formulare le cose in modo da ingannare il modello, probabilmente ci riuscirai prima o poi. Con un po' di tentativi ed errori, puoi creare manualmente esempi come quelli mostrati di seguito. Prova a incollarli nell'app web esistente, controlla la console e visualizza le probabilità che il commento sia spam:

Commenti legittimi pubblicati senza problemi (veri negativi):

  1. "Wow, adoro questo video, ottimo lavoro." Probabilità spam: 47,91854%
  2. "Ho adorato queste demo! Hai altri dettagli?" Probabilità spam: 47,15898%
  3. "Quale sito web posso visitare per saperne di più?" Probabilità spam: 15,32495%

Ottimo, le probabilità per tutti i casi precedenti sono piuttosto basse e superano con successo il SPAM_THRESHOLD predefinito di una probabilità minima del 75% prima che venga intrapresa un'azione (definito nel codice script.js del codelab precedente).

Ora proviamo a scrivere commenti più provocatori che vengono contrassegnati come spam anche se non lo sono…

Commenti legittimi contrassegnati come spam (falsi positivi):

  1. "Qualcuno può linkare il sito web della maschera che indossa?" Probabilità spam: 98,46466%
  2. "Posso acquistare questa canzone su Spotify? Qualcuno mi faccia sapere." Probabilità di spam: 94,40953%
  3. "Qualcuno può contattarmi per fornirmi i dettagli su come scaricare TensorFlow.js?" Probabilità spam: 83,20084%

Oh no! Sembra che questi commenti legittimi vengano contrassegnati come spam quando dovrebbero essere consentiti. Come puoi risolvere il problema?

Un'opzione semplice è aumentare la SPAM_THRESHOLD per avere una confidenza superiore al 98,5%. In questo caso, i commenti classificati erroneamente verranno pubblicati. Tenendo presente questo aspetto, continuiamo con gli altri possibili risultati riportati di seguito…

Commenti spam contrassegnati come spam (veri positivi):

  1. "È fantastico, ma dai un'occhiata ai link di download sul mio sito web, sono migliori!" Probabilità di spam: 99,77873%
  2. "I know some people who can get you some medicines just see my pr0file for details" Probabilità di spam: 98,46955%
  3. "Visita il mio profilo per scaricare altri video fantastici e ancora migliori! http://example.com" Probabilità di spam: 96,26383%

Ok, quindi questo funziona come previsto con la nostra soglia originale del 75%, ma dato che nel passaggio precedente hai modificato SPAM_THRESHOLD in modo che la confidenza sia superiore al 98,5%, ciò significa che qui verranno accettati due esempi, quindi forse la soglia è troppo alta. Forse il 96% è meglio? Tuttavia, se lo fai, uno dei commenti nella sezione precedente (falsi positivi) verrà contrassegnato come spam, anche se era legittimo, in quanto è stato valutato al 98,46466%.

In questo caso, è probabilmente meglio acquisire tutti questi commenti di spam reali e semplicemente eseguire di nuovo l'addestramento per gli errori sopra indicati. Se imposti la soglia al 96%, vengono comunque acquisiti tutti i veri positivi ed elimini due dei falsi positivi sopra indicati. Non male per aver cambiato un solo numero.

Continuiamo…

Commenti spam che sono stati autorizzati a essere pubblicati (falsi negativi):

  1. "Visita il mio profilo per scaricare altri video fantastici e ancora migliori!" Probabilità spam: 7,54926%
  2. "Ottieni uno sconto sui nostri corsi di allenamento in palestra, vedi il profilo!" Probabilità spam: 17,49849%
  3. "Oddio, le azioni GOOG sono schizzate alle stelle! Prendilo prima che sia troppo tardi." Probabilità di spam: 20,42894%

Per questi commenti non puoi fare nulla semplicemente modificando ulteriormente il valore di SPAM_THRESHOLD. La riduzione della soglia per lo spam dal 96% a circa il 9% comporterà la segnalazione di commenti autentici come spam. Uno di questi ha una valutazione del 58% anche se è legittimo. L'unico modo per gestire commenti di questo tipo è riaddestrare il modello includendo questi casi limite nei dati di addestramento, in modo che impari a modificare la sua visione del mondo per distinguere lo spam.

Sebbene l'unica opzione rimasta al momento sia quella di eseguire di nuovo il training del modello, hai anche visto come puoi perfezionare la soglia per decidere quando considerare un elemento come spam per migliorare anche il rendimento. Per un essere umano, il 75% sembra un buon livello di confidenza, ma per questo modello è stato necessario aumentare la percentuale fino all'81,5% per ottenere risultati più efficaci con gli input di esempio.

Non esiste un valore magico che funzioni bene con modelli diversi e questo valore di soglia deve essere impostato in base al modello dopo aver sperimentato con dati reali per capire cosa funziona bene.

Potrebbero verificarsi alcune situazioni in cui un falso positivo (o negativo) potrebbe avere gravi conseguenze (ad es. nel settore medico), pertanto potresti regolare la soglia in modo che sia molto alta e richiedere più revisioni manuali per i casi che non soddisfano la soglia. Questa è una tua scelta in qualità di sviluppatore e richiede un po' di sperimentazione.

4. Riassegna il modello di rilevamento dello spam nei commenti

Nella sezione precedente hai identificato una serie di casi limite che non funzionavano per il modello, per cui l'unica opzione era riaddestrare il modello per tenere conto di queste situazioni. In un sistema di produzione potresti trovarli nel tempo man mano che le persone segnalano manualmente un commento come spam che è stato lasciato passare o che i moderatori che esaminano i commenti segnalati si rendono conto che alcuni non sono effettivamente spam e potrebbero contrassegnarli per il riaddestramento. Supponendo che tu abbia raccolto una serie di nuovi dati per questi casi limite (per ottenere risultati ottimali, dovresti avere alcune varianti di queste nuove frasi, se possibile), ora ti mostreremo come eseguire il retraining del modello tenendo conto di questi casi limite.

Riepilogo del modello predefinito

Il modello predefinito che hai utilizzato è stato creato da una terza parte tramite Model Maker e utilizza un modello di "incorporamento di parole medio" per funzionare.

Poiché il modello è stato creato con Model Maker, dovrai passare brevemente a Python per eseguire di nuovo l'addestramento del modello, quindi esportare il modello creato nel formato TensorFlow.js per poterlo utilizzare nel browser. Per fortuna Model Maker semplifica notevolmente l'utilizzo dei modelli, quindi dovrebbe essere abbastanza facile da seguire e ti guideremo passo passo nella procedura, quindi non preoccuparti se non hai mai utilizzato Python prima d'ora.

Colab

Poiché in questo codelab non ti interessa configurare un server Linux con tutte le varie utilità Python installate, puoi semplicemente eseguire il codice tramite il browser web utilizzando un "notebook Colab". Questi notebook possono connettersi a un "backend", ovvero un server con alcuni elementi preinstallati, da cui puoi eseguire codice arbitrario all'interno del browser web e visualizzare i risultati. Questo è molto utile per la prototipazione rapida o per l'utilizzo in tutorial come questo.

Vai alla pagina colab.research.google.com e vedrai una schermata di benvenuto come mostrato di seguito:

6b82258445885c50.png

Ora fai clic sul pulsante Nuovo blocco note in basso a destra nella finestra popup e dovresti visualizzare un colab vuoto come questo:

2d52c8f7afa88564.png

Bene. Il passaggio successivo consiste nel connettere Colab frontend a un server di backend in modo da poter eseguire il codice Python che scriverai. Per farlo, fai clic su Collega in alto a destra e seleziona Collega a runtime ospitato.

fa5f578a1a3d352b.png

Una volta connesso, dovresti vedere le icone RAM e Disco al suo posto, come in questo esempio:

541c9894fb39d4cb.png

Ottimo lavoro! Ora puoi iniziare a scrivere codice in Python per eseguire il retraining del modello Model Maker. A tale scopo, procedi nel seguente modo.

Passaggio 1

Nella prima cella attualmente vuota, copia il codice riportato di seguito. Verrà installato TensorFlow Lite Model Maker utilizzando il gestore di pacchetti di Python chiamato "pip " (simile a npm, che la maggior parte dei lettori di questo codelab potrebbe conoscere meglio dall'ecosistema JS):

!apt-get install libasound-dev portaudio19-dev libportaudio2 libportaudiocpp0
!pip install -q tflite-model-maker

L'incolla del codice nella cella, tuttavia, non lo eseguirà. A questo punto, passa il mouse sopra la cella grigia in cui hai incollato il codice precedente e vedrai una piccola icona "Riproduci" a sinistra della cella, come evidenziato di seguito:

7ac5e3516bed6335.png Fai clic sul pulsante Riproduci per eseguire il codice appena digitato nella cella.

Ora vedrai l'installazione di Model Maker:

651f21b04fb648cc.png

Una volta completata l'esecuzione di questa cella, come mostrato, passa al passaggio successivo.

Passaggio 2

Successivamente, aggiungi una nuova cella di codice come mostrato di seguito, in modo da poter incollare altro codice dopo la prima cella ed eseguirlo separatamente:

869904a9d774c455.png

La cella successiva eseguita avrà un numero di importazioni che il codice nel resto del notebook dovrà utilizzare. Copia e incolla il codice riportato di seguito nella nuova cella creata:

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')

Si tratta di operazioni piuttosto standard, anche se non hai familiarità con Python. Stai solo importando alcune utilità e le funzioni di Model Maker necessarie per il classificatore di spam. Verrà inoltre verificato se stai eseguendo TensorFlow 2.x, che è un requisito per utilizzare Model Maker.

Infine, come prima, esegui la cella premendo l'icona "Riproduci" quando passi il mouse sopra la cella, e poi aggiungi una nuova cella di codice per il passaggio successivo.

Passaggio 3

Successivamente, scarica i dati da un server remoto sul tuo dispositivo e imposta la variabile training_data in modo che corrisponda al percorso del file locale scaricato risultante:

data_file = tf.keras.utils.get_file(fname='comment-spam-extras.csv', origin='https://storage.googleapis.com/jmstore/TensorFlowJS/EdX/code/6.5/jm_blog_comments_extras.csv', extract=False)

Model Maker può addestrare modelli a partire da semplici file CSV come quello scaricato. Devi solo specificare quali colonne contengono il testo e quali le etichette. Vedrai come farlo nel passaggio 5. Se vuoi, puoi scaricare direttamente il file CSV per vedere cosa contiene.

I più attenti noteranno che il nome di questo file è jm_blog_comments_extras.csv. Questo file è semplicemente i dati di addestramento originali che abbiamo utilizzato per generare il primo modello di spam nei commenti combined con i nuovi dati dei casi limite che hai scoperto, quindi è tutto in un unico file. Oltre alle nuove frasi da cui vuoi che il modello apprenda, ti servono anche i dati di addestramento originali utilizzati per addestrarlo.

(Facoltativo) Se scarichi questo file CSV e controlli le ultime righe, vedrai esempi di casi limite che prima non funzionavano correttamente. Sono stati appena aggiunti alla fine dei dati di addestramento esistenti utilizzati dal modello predefinito per l'addestramento.

Esegui questa cella, quindi, al termine dell'esecuzione, aggiungi una nuova cella e vai al passaggio 4.

Passaggio 4

Quando utilizzi Model Maker, non crei modelli da zero. In genere, utilizzi modelli esistenti che poi personalizzi in base alle tue esigenze.

Model Maker fornisce diversi incorporamenti di modelli pre-appresi che puoi utilizzare, ma il più semplice e rapido per iniziare è average_word_vec, che hai utilizzato nel codelab precedente per creare il tuo sito web. Ecco il codice:

spec = model_spec.get('average_word_vec')
spec.num_words = 2000
spec.seq_len = 20
spec.wordvec_dim = 7

Esegui il codice dopo averlo incollato nella nuova cella.

Informazioni su

num_words

parameter

È il numero di parole che vuoi che il modello utilizzi. Potresti pensare che più parole chiave ci sono, meglio è, ma in genere esiste un punto ottimale in base alla frequenza con cui viene utilizzata ogni parola. Se utilizzi ogni parola dell'intero corpus, il modello potrebbe tentare di apprendere e bilanciare i pesi delle parole utilizzate una sola volta, il che non è molto utile. 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. In questo modo, puoi ottimizzare il modello in base al numero di parole che preferisci utilizzando il parametro num_words. Un numero inferiore qui genererà 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 potenzialmente più lento. Trovare il giusto equilibrio è fondamentale e spetta a te, in qualità di ingegnere di machine learning, capire cosa funziona meglio per il tuo caso d'uso.

Informazioni su

wordvec_dim

parameter

Il parametro wordvec_dim è il numero di dimensioni che vuoi utilizzare per il vettore di ogni parola. Queste dimensioni sono essenzialmente le diverse caratteristiche (create dall'algoritmo di machine learning durante l'addestramento) in base alle quali è possibile misurare una determinata parola, che il programma utilizzerà per cercare di associare al meglio le parole simili in qualche modo significativo.

Ad esempio, se avessi una dimensione per indicare quanto è "medica" una parola, una parola come "pillole" potrebbe ottenere un punteggio elevato in questa dimensione ed essere associata ad altre parole con punteggio elevato come "radiografia", mentre "gatto" otterrebbe un punteggio basso in questa dimensione. Potrebbe risultare utile una "dimensione medica" per determinare lo spam se combinata con altre dimensioni potenziali che potrebbe decidere di utilizzare e che sono significative.

Nel caso di parole che ottengono un punteggio elevato nella "dimensione medica", potrebbe essere utile una seconda dimensione che correli le parole al corpo umano. Parole come "gamba", "braccio" e "collo" potrebbero ottenere un punteggio elevato qui e anche nella dimensione medica.

Il modello può utilizzare queste dimensioni per rilevare le parole più probabilmente associate allo spam. Forse le email di spam hanno maggiori probabilità di contenere parole che si riferiscono sia a termini medici che a parti del corpo umano.

La regola empirica determinata dalla ricerca è che la quarta radice del numero di parole funziona bene per questo parametro. Quindi, se utilizzo 2000 parole, un buon punto di partenza è 7 dimensioni. Se modifichi il numero di parole utilizzate, puoi modificare anche questo valore.

Informazioni su

seq_len

parameter

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, che sta per "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, proprio come nel primo codelab di questa serie.

Passaggio 5: carica i dati di addestramento

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 la specifica del modello che hai creato nel passaggio 4, insieme a un carattere delimitatore, che in questo caso è una virgola, poiché il file è separato da virgole. Imposti anche un parametro di rimescolamento per riorganizzare in modo casuale i dati di addestramento, in modo che gli elementi simili o raccolti insieme vengano distribuiti in modo casuale nel set di dati.

Dopodiché, utilizzerai data.split() per suddividere i dati in dati di addestramento e test. .9 indica che il 90% del set di dati verrà utilizzato per l'addestramento, il resto per il test.

Passaggio 6: crea il modello

Aggiungi un'altra cella in cui aggiungeremo il codice per creare il modello:

model = text_classifier.create(train_data, model_spec=spec, epochs=50)

In questo modo viene creato un modello di classificazione del testo con Model Maker e vengono specificati i dati di addestramento da utilizzare (definiti nel passaggio 4), la specifica del modello (configurata anch'essa 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 pre-addestrati 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, come mostrato di seguito:

bbe4b896d8060bc4.png

Misurerà quindi i risultati e modificherà i pesi del modello per perfezionare la previsione, quindi riproverà. Questo è un periodo. Pertanto, specificando epochs=50, il ciclo verrà ripetuto 50 volte, come mostrato di seguito:

4ed286d114960ca.png

Pertanto, quando raggiungi la 50ª epoca, il modello segnalerà un livello di precisione molto più elevato. In questo caso, il valore è 99,1%.

Passaggio 7: 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 TensorFlow.js per essere utilizzato in una pagina web. Incolla il seguente codice in una nuova cella ed eseguilo:

model.export(export_dir="/js_export/", export_format=[ExportFormat.TFJS, ExportFormat.LABEL, ExportFormat.VOCAB])
!zip -r /js_export/ModelFiles.zip /js_export/

Dopo aver eseguito questo codice, se fai clic sulla piccola icona della cartella a sinistra di Colab, puoi andare alla cartella in cui hai esportato i file in precedenza (nella directory principale, potrebbe essere necessario salire di un livello) e trovare il bundle zip dei file esportati contenuti in ModelFiles.zip.

Scarica subito questo file ZIP sul computer, in quanto utilizzerai questi file proprio come nel primo codelab:

cda3c681ebf144b4.png

Bene. La parte di Python è terminata, ora puoi tornare al mondo di JavaScript che conosci e ami. Finalmente.

5. Pubblicazione del nuovo modello di machine learning

Ora è quasi tutto pronto per caricare il modello. Prima di poterlo fare, devi caricare i nuovi file del modello scaricati in precedenza nel codelab in modo che siano ospitati e utilizzabili all'interno del tuo codice.

Innanzitutto, se non l'hai ancora fatto, decomprimi i file del modello appena scaricato dal notebook Colab Model Maker appena eseguito. Dovresti vedere i seguenti file contenuti nelle varie cartelle:

3ace87c57b98cfbc.png

Che cosa hai qui?

  • model.json: uno dei file che compongono il modello TensorFlow.js addestrato. Farai riferimento a questo file specifico nel codice JS.
  • group1-shard1of1.bin: si tratta di un file binario contenente gran parte dei dati salvati per il modello TensorFlow.js esportato e dovrà essere ospitato da qualche parte sul server per il download nella stessa directory di model.json sopra.
  • vocab: questo strano file senza estensione proviene da Model Maker e ci mostra come codificare le parole nelle frasi in modo che il modello capisca come utilizzarle. Approfondiremo questo argomento nella prossima sezione.
  • labels.txt: contiene semplicemente i nomi delle classi risultanti che il modello prevede. Per questo modello, se apri il file nell'editor di testo, sono elencati semplicemente "false" e "true", che indicano "non spam" o "spam" come output di previsione.

Ospitare i file del modello TensorFlow.js

Per prima cosa, posiziona i file model.json e *.bin generati su un server web in modo da potervi accedere tramite la pagina web.

Eliminare i file del modello esistenti

Poiché stai lavorando sul risultato finale del primo codelab di questa serie, devi prima eliminare i file del modello esistenti caricati. Se utilizzi Glitch.com, controlla il riquadro dei file a sinistra per model.json e group1-shard1of1.bin, fai clic sul menu a discesa con tre puntini per ogni file e seleziona Elimina come mostrato:

c72bfdc5a0db4d0d.png

Caricare nuovi file su Glitch

Bene. Ora carica i nuovi:

  1. Apri la cartella assets nel riquadro a sinistra del progetto Glitch ed elimina gli asset caricati in precedenza se hanno lo stesso nome.
  2. Fai clic su Carica un asset e seleziona group1-shard1of1.bin da caricare in questa cartella. Una volta caricato, dovrebbe avere il seguente aspetto:

c6739dd30e6df977.png

  1. Bene. Ora fai lo stesso per il file model.json, in modo che nella cartella degli asset siano presenti due file:

b7858eb08bea9ac3.png

  1. Se fai clic sul file group1-shard1of1.bin che hai appena caricato, potrai copiare l'URL della sua posizione. Copia questo percorso ora come mostrato:

19999f6644f61153.png

  1. Ora, in basso a sinistra dello schermo, fai clic su Strumenti > Terminale. Attendi il caricamento della finestra del terminale.
  2. Una volta caricato, digita quanto segue e premi Invio per cambiare directory nella cartella www:

terminal:

cd www
  1. Successivamente, utilizza wget per scaricare i due file appena caricati sostituendo gli URL riportati di seguito con gli URL generati per i file nella cartella degli asset su Glitch (controlla la cartella degli asset per l'URL personalizzato di ogni file).

Nota lo spazio tra i due URL e che gli URL che dovrai utilizzare saranno diversi da quelli mostrati, ma avranno un aspetto simile:

terminal

wget https://cdn.glitch.com/1cb82939-a5dd-42a2-9db9-0c42cab7e407%2Fmodel.json?v=1616111344958 https://cdn.glitch.com/1cb82939-a5dd-42a2-9db9-0c42cab7e407%2Fgroup1-shard1of1.bin?v=1616017964562

Eccellente. Ora hai creato una copia dei file caricati nella cartella www.

Tuttavia, al momento verranno scaricati con nomi strani. Se digiti ls nel terminale e premi Invio, vedrai qualcosa di simile a questo:

6c417fdfc64762f1.png

  1. Utilizza il comando mv per rinominare i file. Digita quanto segue nella console e premi Invio dopo ogni riga:

terminal:

mv *group1-shard1of1.bin* group1-shard1of1.bin
mv *model.json* model.json
  1. Infine, aggiorna il progetto Glitch digitando refresh nel terminale e premi Invio:

terminal:

refresh

Dopo l'aggiornamento, dovresti visualizzare model.json e group1-shard1of1.bin nella cartella www dell'interfaccia utente:

530bb651f4dbac64.png

Bene. L'ultimo passaggio consiste nell'aggiornamento del file dictionary.js.

  1. Converti il nuovo file del vocabolario scaricato nel formato JS corretto manualmente tramite l'editor di testo o utilizzando questo strumento e salva l'output risultante come dictionary.js nella cartella www. Se hai già un file dictionary.js, puoi semplicemente copiare e incollare i nuovi contenuti e salvare il file.

Bene! Hai aggiornato correttamente tutti i file modificati e se ora provi a utilizzare il sito web noterai come il modello riaddestrato dovrebbe essere in grado di tenere conto dei casi limite scoperti e appresi, come mostrato di seguito:

64e5cf6f6e158d6c.gif

Come puoi vedere, i primi 6 ora sono classificati correttamente come non spam, mentre il secondo gruppo di 6 è identificato come spam. Perfetto!

Proviamo anche alcune varianti per vedere se la generalizzazione è stata eseguita correttamente. Inizialmente era presente una frase non corretta, ad esempio:

"Oddio, le azioni GOOG sono schizzate verso l'alto! Ottienilo prima che sia troppo tardi!"

Ora è classificato correttamente come spam, ma cosa succede se lo modifichi in:

"Quindi il valore delle azioni di XYZ è appena aumentato. Acquistane alcuni prima che sia troppo tardi."

Qui viene visualizzata una previsione del 98% di probabilità che si tratti di spam, il che è corretto anche se hai modificato leggermente il simbolo azionario e la formulazione.

Naturalmente, se provi a violare questo nuovo modello, ci riuscirai. Per avere le migliori possibilità di acquisire variazioni più uniche per le situazioni comuni che probabilmente incontrerai online, dovrai raccogliere ancora più dati di addestramento. In un futuro codelab ti mostreremo come migliorare continuamente il tuo modello con i dati in tempo reale man mano che vengono segnalati.

6. Complimenti!

Congratulazioni, sei riuscito a eseguire il retraining di un modello di machine learning esistente per aggiornarlo in modo che funzioni per i casi limite che hai trovato e hai implementato queste modifiche nel browser con TensorFlow.js per un'applicazione reale.

Riepilogo

In questo codelab:

  1. Sono stati rilevati casi limite che non funzionavano quando si utilizzava il modello predefinito di spam nei commenti
  2. È stato eseguito il retraining del modello Model Maker per tenere conto dei casi limite che hai scoperto
  3. Esportato il nuovo modello addestrato nel formato TensorFlow.js
  4. Aggiornato l'app web per utilizzare i nuovi file

Passaggi successivi

Questo aggiornamento funziona alla perfezione, ma come per qualsiasi app web, nel tempo verranno apportate delle modifiche. Sarebbe molto meglio se l'app migliorasse continuamente nel tempo, invece di doverlo fare manualmente ogni volta. Riesci a pensare a come potresti automatizzare questi passaggi per riaddestrare automaticamente un modello dopo aver, ad esempio, 100 nuovi commenti contrassegnati come classificati in modo errato? Se ti metti nei panni di un ingegnere web, probabilmente riuscirai a capire come creare una pipeline per eseguire questa operazione automaticamente. In caso contrario, non preoccuparti: nel prossimo codelab della serie ti mostreremo come fare.

Condividi con noi i tuoi contenuti

Puoi estendere facilmente ciò che hai creato oggi anche ad altri casi d'uso creativi e ti invitiamo a pensare fuori dagli schemi e a continuare a sperimentare.

Ricordati di taggarci sui social media utilizzando l'hashtag #MadeWithTFJS per avere la possibilità che il tuo progetto venga pubblicato sul blog di TensorFlow o addirittura in eventi futuri. Ci piacerebbe vedere le tue creazioni.

Altre codelab su TensorFlow.js per approfondire l'argomento

Siti web da visitare