Programmering

Hvordan bruke TensorFlow i nettleseren din

Mens du kan trene enkle nevrale nettverk med relativt små mengder treningsdata med TensorFlow, for dype nevrale nettverk med store treningsdatasett trenger du virkelig å bruke CUDA-kompatible Nvidia GPUer, eller Google TPUer eller FPGAer for akselerasjon. Alternativet har inntil nylig vært å trene på klynger av CPUer i flere uker.

En av innovasjonene introdusert med TensorFlow 2.0 er en JavaScript-implementering, TensorFlow.js. Jeg hadde ikke forventet at det skulle forbedre opplærings- eller inferenshastigheten, men det gjør det, gitt sin støtte til alle GPUer (ikke bare CUDA-kompatible GPUer) via WebGL API.

[Også på: TensorFlow 2.0 anmeldelse: Enklere maskinlæring]

Hva er TensorFlow.js?

TensorFlow.js er et bibliotek for å utvikle og trene maskinlæringsmodeller i JavaScript, og distribuere dem i en nettleser eller på Node.js. Du kan bruke eksisterende modeller, konvertere Python TensorFlow-modeller, bruke transfer learning for å omskole eksisterende modeller med dine egne data, og utvikle modeller fra bunnen av.

TensorFlow.js bakenden slutter

TensorFlow.js støtter flere bakenden for utføring, selv om bare en kan være aktiv om gangen. TensorFlow.js Node.js-miljøet støtter bruk av en installert versjon av Python / C TensorFlow som en back-end, som igjen kan bruke maskinens tilgjengelige maskinvareakselerasjon, for eksempel CUDA. Det er også en JavaScript-basert backend for Node.js, men dens evner er begrenset.

I nettleseren har TensorFlow.js flere bakenden med forskjellige egenskaper. WebGL-bakenden gir GPU-støtte ved bruk av WebGL-teksturer for lagring og WebGL-skyggelegger for utføring, og kan være opptil 100 ganger raskere enn den vanlige CPU-bakenden. WebGL krever ikke CUDA, så det kan dra nytte av hva GPU er tilstede.

WebAssembly (WASM) TensorFlow.js bakenden for nettleseren bruker XNNPACK-biblioteket for optimal CPU-implementering av nevrale nettverksoperatører. WASM-bakenden er generelt mye raskere (10x til 30x) enn JavaScript-CPU-enden, men er vanligvis tregere enn WebGL-bakenden, bortsett fra veldig små modeller. Kjørelengden din kan variere, så test både WASM og WebGL bakenden for dine egne modeller på din egen maskinvare.

TensorFlow.js modeller og lag

TensorFlow.js støtter to APIer for å bygge nevrale nettverksmodeller. Den ene er Layers API, som egentlig er den samme som Keras API i TensorFlow 2. Den andre er Core API, som egentlig er direkte manipulering av tensorer.

I likhet med Keras har TensorFlow.js Layers API to måter å lage en modell på: sekvensiell og funksjonell. Den sekvensielle API er en lineær stabel med lag, implementert med en lagliste (som vist nedenfor) eller med model.add () metode:

const model = tf.sequential ({

lag: [

tf.layers.dense ({inputShape: [784], enheter: 32, aktivering: 'relu'}),

tf.layers.dense ({enheter: 10, aktivering: 'softmax'}),

 ]

});

Den funksjonelle API bruker tf.modell () API og kan opprette vilkårlige DAG-nettverk (rettet acyklisk graf):

// Lag en vilkårlig graf med lag ved å koble dem sammen

// via metoden Apply ().

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

const tense1 = tf.layers.dense ({enheter: 32, aktivering: 'relu'}). gjelder (input);

const dense2 = tf.layers.dense ({enheter: 10, aktivering: 'softmax'}). gjelder (tett1);

const model = tf.model ({innganger: inngang, utganger: tett2});

Core API kan oppnå de samme målene, med annen kode og mindre intuitiv tilknytning til lag. Modellen nedenfor kan se ut som grunnleggende tensoroperasjoner, men den skaper det samme nettverket som de to forrige formuleringene. Legg merke til bruken av relu () og softmax (), som begge er nevrale nettverksoperasjoner, i modell() funksjon nedenfor.

// Vektene og forspenningene for de to tette lagene.

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]));

funksjonsmodell (x) {

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

}

Forhåndsbygde TensorFlow.js-modeller

Det er over et dusin forhåndsbygde TensorFlow.js-modeller dokumentert, tilgjengelig i depotet og vert på NPM (for bruk i Node.js) og unpkg (for bruk i en nettleser). Du kan bruke disse modellene som levert eller for transferlæring. Med litt arbeid kan du også bruke dem som byggesteiner for andre modeller.

Flere av disse modellene bruker enhetens kamera i sanntid, for eksempel hånddrift:

Listen nedenfor er en praktisk indeks for de fleste av de forhåndspakkede TensorFlow.js-modellene.

  • Bildeklassifisering
  • Objektdeteksjon
  • Kroppssegmentering
  • Pose estimering
  • Teksttoksisitet påvisning
  • Universal setningskoder
  • Talekommandogjenkjenning
  • KNN klassifisering
  • Enkel ansiktsregistrering
  • Semantisk segmentering
  • Ansikt landemerke deteksjon
  • Håndposeringsdeteksjon
  • Svar på naturlig språk

Hva er ml5.js?

ml5.js er et åpen kildekode, vennlig, høyt nivå grensesnitt til TensorFlow.js utviklet primært ved NYU. ml5.js gir øyeblikkelig tilgang til nettleseren til pre-trente modeller for å oppdage menneskelige positurer, generere tekst, utforme et bilde med en annen, komponere musikk, tonehøydeoppdagelse, vanlige engelskspråklige ordforhold og mye mer. Mens TensorFlow.js primært er rettet mot dataforskere og utviklere, har ml5.js som mål å støtte bredere offentlig forståelse av maskinlæring og fremme dypere engasjement med etisk databehandling, ansvarlig datainnsamling, og tilgjengelighet og mangfold av mennesker og perspektiver innen teknologi og kunst .

De fleste eksemplene i ml5.js er avhengig av TensorFlow.js-modeller. De har blitt pakket som nettsider som du kan kjøre som de er, eller redigere, for eksempel for å bruke forskjellige bilder.

Demo: Irisklassifisering med TensorFlow.js

Det berømte Iris-diskrimineringsdatasettet, stammer fra R.A. Fisher i 1936 for å illustrere lineær diskriminantanalyse, brukes fremdeles som en test case for statistiske og maskinlærings klassifiseringsmetoder. Den bruker fire funksjoner, lengden og bredden på blomsterbladene og kronbladene, for å klassifisere tre arter av iris, med 50 prøver av hver art. (Fishers originale papir ble publisert i Annaler for eugenikk, som sier mer om vitenskap i 1936 enn om data eller statistikk.)

Hvis du utfører klyngeanalyse på disse dataene, vil to av artene dele en klynge, med den tredje (I. Setosa) i en egen klynge. På den annen side kan hovedkomponentanalyse skille alle tre artene ganske bra.

TensorFlow.js-prøven passer til Iris-dataene med to fullt tilkoblede (tette) nevrale nettverkslag, som vist i kodeutdraget nedenfor.

// Definer topologien til modellen: to tette lag.

const model = tf.sequential ();

model.add (tf.layers.dense (

{enheter: 10, aktivering: 'sigmoid', inputShape: [xTrain.shape [1]]}

));

model.add (tf.layers.dense ({enheter: 3, aktivering: 'softmax'}));

model.summary ();

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

modell.kompilere ({

optimizer: optimizer,

tap: 'categoricalCrossentropy',

beregninger: ['nøyaktighet'],

});

Som du kan se på skjermbildet nedenfor, gjør denne modellen en anstendig jobb med å klassifisere de tre artene. Hvis du leker med parametrene, vil du imidlertid oppdage at noe forvirring mellom to av artene (de i samme klynge) dukker opp igjen hvis du gjentar i mer enn 40 epoker.

Konvertering av Python TensorFlow-modeller til JavaScript

En del av TensorFlow.js-depotet inneholder en omformer for lagrede TensorFlow- og Keras-modeller. Den støtter tre formater: SavedModel (standard for TensorFlow), HDF5 (standard for Keras) og TensorFlow Hub. Du kan bruke omformeren til lagrede modeller fra standardregister, modeller du har trent selv og modeller du har funnet andre steder.

Det er faktisk to trinn til konverteringen. Det første trinnet er å konvertere den eksisterende modellen til modell.json og binære vektfiler. Det andre trinnet er å bruke en API for å laste modellen inn i TensorFlow.js, enten tf.loadGraphModel for konverterte TensorFlow og TensorFlow Hub modeller, eller tf.loadLayersModel for ombygde Keras-modeller.

Bruke transfer learning

TensorFlow.js støtter overføringslæring på omtrent samme måte som TensorFlow. Dokumentasjonen inneholder eksempler for å tilpasse MobileNet for dine egne bilder og tilpasse en modell for talekommandogjenkjenning for dine egne lydklasser. I hovedsak er det du gjør i hver av disse kodelabene, å legge til en liten tilpasset klassifisering på toppen av den trente modellen, og trene det.

Totalt sett kan TensorFlow.js gjøre nesten alt hva TensorFlow kan gjøre. Men med tanke på at målmiljøene for TensorFlow.js (hage-utvalg GPUer for spill) vanligvis har mindre i veien for GPU-minne enn de store Nvidia-server-GPUene som vanligvis brukes til TensorFlow dyp læringstrening, kan det hende du må redusere størrelsen på modell for å få den til å kjøre i en nettleser. Konverteringsverktøyet gjør noe av dette for deg, men du må kanskje ta ut lag manuelt og redusere batchstørrelsene for treningen din.

$config[zx-auto] not found$config[zx-overlay] not found