Come utilizzare TensorFlow nel tuo browser

Sebbene sia possibile addestrare reti neurali semplici con quantità relativamente piccole di dati di addestramento con TensorFlow, per reti neurali profonde con set di dati di addestramento di grandi dimensioni è necessario utilizzare GPU Nvidia compatibili con CUDA, TPU Google o FPGA per l'accelerazione. Fino a poco tempo fa, l'alternativa era quella di allenarsi su cluster di CPU per settimane.

Una delle innovazioni introdotte con TensorFlow 2.0 è un'implementazione JavaScript, TensorFlow.js. Non mi sarei aspettato che migliorasse la formazione o la velocità di inferenza, ma lo fa, dato il suo supporto per tutte le GPU (non solo le GPU compatibili con CUDA) tramite l'API WebGL.

[Anche su: recensione di TensorFlow 2.0: apprendimento automatico più semplice]

Cos'è TensorFlow.js?

TensorFlow.js è una libreria per lo sviluppo e l'addestramento di modelli di machine learning in JavaScript e per la loro distribuzione in un browser o su Node.js. Puoi utilizzare modelli esistenti, convertire modelli Python TensorFlow, utilizzare transfer learning per riqualificare i modelli esistenti con i tuoi dati e sviluppare modelli da zero.

Il back end di TensorFlow.js

TensorFlow.js supporta più back-end per l'esecuzione, sebbene solo uno alla volta possa essere attivo. L'ambiente TensorFlow.js Node.js supporta l'utilizzo di una build installata di Python / C TensorFlow come back-end, che a sua volta può utilizzare l'accelerazione hardware disponibile della macchina, ad esempio CUDA. Esiste anche un back-end basato su JavaScript per Node.js, ma le sue capacità sono limitate.

Nel browser, TensorFlow.js ha diversi back-end con caratteristiche diverse. Il back-end WebGL fornisce il supporto GPU utilizzando le texture WebGL per l'archiviazione e gli shader WebGL per l'esecuzione e può essere fino a 100 volte più veloce del semplice back-end della CPU. WebGL non richiede CUDA, quindi può sfruttare qualsiasi GPU presente.

Il back-end WebAssembly (WASM) TensorFlow.js per il browser utilizza la libreria XNNPACK per l'implementazione ottimizzata della CPU degli operatori di rete neurale. Il back-end WASM è generalmente molto più veloce (da 10x a 30x) del back-end della CPU JavaScript, ma di solito è più lento del back-end WebGL ad eccezione dei modelli molto piccoli. Il tuo chilometraggio può variare, quindi prova entrambi i back end WASM e WebGL per i tuoi modelli sul tuo hardware.

Modelli e livelli TensorFlow.js

TensorFlow.js supporta due API per la creazione di modelli di rete neurale. Una è l'API dei livelli, che è essenzialmente la stessa dell'API di Keras in TensorFlow 2. L'altra è l'API principale, che è essenzialmente la manipolazione diretta dei tensori.

Come Keras, l'API Layers TensorFlow.js ha due modi per creare un modello: sequenziale e funzionale. L'API sequenziale è uno stack lineare di livelli, implementato con un elenco di livelli (come mostrato di seguito) o con il model.add()metodo:

const model = tf.sequential ({

 strati: [

   tf.layers.dense ({inputShape: [784], unità: 32, attivazione: 'relu'}),

   tf.layers.dense ({unità: 10, attivazione: 'softmax'}),

 ]

});

L'API funzionale utilizza l' tf.model()API e può creare reti DAG arbitrarie (grafo aciclico diretto):

// Crea un grafico arbitrario di livelli, collegandoli

// tramite il metodo apply ().

const input = tf.input ({shape: [784]});

const dense1 = tf.layers.dense ({unità: 32, attivazione: 'relu'}). apply (input);

const dense2 = tf.layers.dense ({unità: 10, attivazione: 'softmax'}). apply (dense1);

const model = tf.model ({input: input, output: dense2});

L'API principale può raggiungere gli stessi obiettivi, con codice diverso e un legame meno intuitivo ai livelli. Il modello seguente può sembrare operazioni tensoriali di base, ma crea la stessa rete delle due formulazioni precedenti. Notare l'uso di relu()e softmax(), che sono entrambe operazioni di rete neurale, nella model()funzione sottostante.

// I pesi e le polarizzazioni per i due strati densi.

const w1 = tf.variable (tf.randomNormal ([784, 32]));

const b1 = tf.variable (tf.randomNormal ([32]));

const w2 = tf.variable (tf.randomNormal ([32, 10]));

const b2 = tf.variable (tf.randomNormal ([10]));

modello di funzione (x) {

  ritorno x.matMul (w1) .add (b1) .relu (). matMul (w2) .add (b2) .softmax ();

}

Modelli TensorFlow.js precostruiti

Sono disponibili oltre una dozzina di modelli TensorFlow.js predefiniti documentati, disponibili nel repository e ospitati su NPM (per l'utilizzo in Node.js) e unpkg (per l'utilizzo in un browser). È possibile utilizzare questi modelli così come forniti o per l'apprendimento del trasferimento. Con un po 'di lavoro, puoi anche usarli come elementi costitutivi per altri modelli.

Molti di questi modelli utilizzano la fotocamera di un dispositivo in tempo reale, ad esempio la mano:

L'elenco seguente è un comodo indice della maggior parte dei modelli TensorFlow.js preconfezionati.

  • Classificazione delle immagini
  • Rilevamento di oggetti
  • Segmentazione del corpo
  • Stima della posa
  • Rilevazione della tossicità del testo
  • Codificatore di frasi universali
  • Riconoscimento dei comandi vocali
  • Classificatore KNN
  • Rilevamento semplice dei volti
  • Segmentazione semantica
  • Rilevamento del punto di riferimento del viso
  • Rilevamento della posa della mano
  • Risposta alla domanda in linguaggio naturale

Cos'è ml5.js?

ml5.js è un'interfaccia open source, amichevole e di alto livello per TensorFlow.js sviluppata principalmente alla NYU. ml5.js fornisce l'accesso immediato nel browser a modelli pre-addestrati per rilevare pose umane, generare testo, applicare lo stile a un'immagine con un'altra, comporre musica, rilevamento del tono, relazioni di parole in lingua inglese comune e molto altro. Mentre TensorFlow.js è rivolto principalmente a data scientist e sviluppatori, ml5.js mira a supportare una più ampia comprensione da parte del pubblico dell'apprendimento automatico e promuovere un coinvolgimento più profondo con il calcolo etico, la raccolta responsabile dei dati, l'accessibilità e la diversità delle persone e le prospettive nella tecnologia e nelle arti .

La maggior parte degli esempi in ml5.js dipende dai modelli TensorFlow.js. Sono state impacchettate come pagine Web che è possibile eseguire così come sono o modificare, ad esempio per utilizzare immagini diverse.

Demo: classificazione dell'iride con TensorFlow.js

Il famoso set di dati sulla discriminazione Iris, creato da RA Fisher nel 1936 per illustrare l'analisi discriminante lineare, è ancora utilizzato come caso di prova per metodi di classificazione statistici e di apprendimento automatico. Utilizza quattro caratteristiche, la lunghezza e la larghezza dei sepali e dei petali dei fiori, per classificare tre specie di Iris, con 50 campioni di ciascuna specie. (L'articolo originale di Fisher è stato pubblicato negli Annals of Eugenics , che dice di più sulla scienza nel 1936 che sui dati o sulle statistiche.)

Se si esegue l'analisi dei cluster su questi dati, due delle specie condivideranno un cluster, con la terza (I. Setosa) in un cluster separato. D'altra parte, l'analisi delle componenti principali può separare abbastanza bene tutte e tre le specie.

L'esempio TensorFlow.js adatta i dati Iris con due livelli di rete neurale completamente connessi (densi), come mostrato nell'estratto di codice di seguito.

// Definisce la topologia del modello: due strati densi.

const model = tf.sequential ();

model.add (tf.layers.dense (

{unità: 10, attivazione: "sigmoid", inputShape: [xTrain.shape [1]]}

));

model.add (tf.layers.dense ({unità: 3, attivazione: 'softmax'}));

model.summary ();

const optimizer = tf.train.adam (params.learningRate);

model.compile ({

ottimizzatore: ottimizzatore,

perdita: 'categoricalCrossentropy',

metriche: ["accuratezza"],

});

Come puoi vedere nello screenshot qui sotto, questo modello fa un buon lavoro nel classificare le tre specie. Se giochi con i parametri, tuttavia, scoprirai che una certa confusione tra due delle specie (quelle nello stesso ammasso) riappare se iterate per più di 40 epoche.

Conversione di modelli Python TensorFlow in JavaScript

Parte del repository TensorFlow.js contiene un convertitore per i modelli TensorFlow e Keras salvati. Supporta tre formati: SavedModel (l'impostazione predefinita per TensorFlow), HDF5 (l'impostazione predefinita per Keras) e TensorFlow Hub. Puoi utilizzare il convertitore per i modelli salvati dai repository standard, i modelli che hai addestrato personalmente e i modelli che hai trovato altrove.

In realtà ci sono due passaggi per la conversione. Il primo passo è convertire il modello esistente in model.json e file di peso binario. Il secondo passaggio consiste nell'utilizzare un'API per caricare il modello in TensorFlow.js, sia tf.loadGraphModelper i modelli TensorFlow e TensorFlow Hub tf.loadLayersModelconvertiti , sia per i modelli Keras convertiti.

Utilizzo del transfer learning

TensorFlow.js supporta l'apprendimento del trasferimento essenzialmente nello stesso modo di TensorFlow. La documentazione fornisce esempi per personalizzare MobileNet per le proprie immagini e personalizzare un modello per il riconoscimento dei comandi vocali per le proprie classi di suoni. In sostanza, ciò che stai facendo in ciascuno di questi codelab è aggiungere un piccolo classificatore personalizzato sopra il modello addestrato e addestrarlo.

Nel complesso, TensorFlow.js può fare quasi tutto ciò che può fare TensorFlow. Tuttavia, dato che gli ambienti di destinazione per TensorFlow.js (GPU di varietà da giardino per i giochi) in genere hanno meno memoria GPU rispetto alle grandi GPU per server Nvidia tipicamente utilizzate per la formazione di deep learning TensorFlow, potresti dover ridurre le dimensioni del tuo modello per farlo funzionare in un browser. L'utilità di conversione esegue alcune operazioni per te, ma potresti dover rimuovere i livelli manualmente e ridurre le dimensioni del batch per la tua formazione.