Programmering

Sådan bruges TensorFlow i din browser

Mens du kan træne enkle neurale netværk med relativt små mængder træningsdata med TensorFlow, for dybe neurale netværk med store træningsdatasæt skal du virkelig bruge CUDA-kompatible Nvidia GPU'er eller Google TPU'er eller FPGA'er til acceleration. Alternativet har indtil for nylig været at træne på klynger af CPU'er i flere uger.

En af de innovationer, der blev introduceret med TensorFlow 2.0, er en JavaScript-implementering, TensorFlow.js. Jeg havde ikke forventet at forbedre træning eller inferenshastighed, men det gør det, da det understøtter alle GPU'er (ikke kun CUDA-kompatible GPU'er) via WebGL API.

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

Hvad er TensorFlow.js?

TensorFlow.js er et bibliotek til udvikling og træning af maskinlæringsmodeller i JavaScript og implementering af dem i en browser eller på Node.js. Du kan bruge eksisterende modeller, konvertere Python TensorFlow-modeller, bruge transfer learning til at omskole eksisterende modeller med dine egne data og udvikle modeller fra bunden.

TensorFlow.js bagenden

TensorFlow.js understøtter flere bagenden til udførelse, selvom kun en kan være aktiv ad gangen. TensorFlow.js Node.js-miljøet understøtter brug af en installeret build af Python / C TensorFlow som en back-end, som igen kan bruge maskinens tilgængelige hardwareacceleration, for eksempel CUDA. Der er også en JavaScript-baseret back-end til Node.js, men dens muligheder er begrænsede.

I browseren har TensorFlow.js flere bagenden med forskellige karakteristika. WebGL-bagenden giver GPU-understøttelse ved hjælp af WebGL-teksturer til opbevaring og WebGL-shaders til udførelse og kan være op til 100 gange hurtigere end den almindelige CPU-bagende. WebGL kræver ikke CUDA, så det kan drage fordel af uanset hvilken GPU der er til stede.

WebAssembly (WASM) TensorFlow.js bagenden til browseren bruger XNNPACK-biblioteket til optimeret CPU-implementering af neurale netværksoperatører. WASM-backenden er generelt meget hurtigere (10x til 30x) end JavaScript-CPU-backenden, men er normalt langsommere end WebGL-backend bortset fra meget små modeller. Din kilometertal kan variere, så test både WASM- og WebGL-bagenden til dine egne modeller på din egen hardware.

TensorFlow.js modeller og lag

TensorFlow.js understøtter to API'er til opbygning af neurale netværksmodeller. Den ene er Layers API, som i det væsentlige er den samme som Keras API i TensorFlow 2. Den anden er Core API, som i det væsentlige er direkte manipulation af tensorer.

Ligesom Keras har TensorFlow.js Layers API to måder at oprette en model på: sekventiel og funktionel. Den sekventielle API er en lineær stak af lag, implementeret med en lagliste (som vist nedenfor) eller med model.add () metode:

const model = tf.sequential ({

lag: [

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

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

 ]

});

Den funktionelle API bruger tf.model () API og kan oprette vilkårlige DAG-netværk (rettet acyklisk graf):

// Opret en vilkårlig graf med lag ved at forbinde dem

// via metoden Apply ().

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

const dense1 = tf.layers.dense ({enheder: 32, aktivering: 'relu'}). anvend (input);

const dense2 = tf.layers.dense ({enheder: 10, aktivering: 'softmax'}). anvend (tæt 1);

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

Core API kan opnå de samme mål med anden kode og mindre intuitiv tilknytning til lag. Modellen nedenfor kan se ud som grundlæggende tensoroperationer, men den skaber det samme netværk som de to tidligere formuleringer. Bemærk brugen af relu () og softmax (), som begge er neurale netværksoperationer, i model() funktion nedenfor.

// Vægtene og forspændingerne for de to tætte lag.

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

funktionsmodel (x) {

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

}

Forudbyggede TensorFlow.js-modeller

Der er over et dusin forudbyggede TensorFlow.js-modeller dokumenteret, tilgængelige i lageret og hostet på NPM (til brug i Node.js) og unpkg (til brug i en browser). Du kan bruge disse modeller som leveret eller til transferlæring. Med lidt arbejde kan du også bruge dem som byggesten til andre modeller.

Flere af disse modeller bruger en enheds kamera i realtid, for eksempel håndpose:

Listen nedenfor er et praktisk indeks i de fleste af de færdigpakkede TensorFlow.js-modeller.

  • Billedklassificering
  • Objektdetektion
  • Kropssegmentering
  • Pose estimering
  • Tekst toksicitet påvisning
  • Universal sætningskoder
  • Genkendelse af talekommandoer
  • KNN klassifikator
  • Enkel ansigtsregistrering
  • Semantisk segmentering
  • Registrering af ansigt til vartegn
  • Detektion af håndposition
  • Naturligt sprog besvarelse

Hvad er ml5.js?

ml5.js er en open source, venlig interface på højt niveau til TensorFlow.js udviklet primært på NYU. ml5.js giver øjeblikkelig adgang i browseren til foruddannede modeller til detektering af menneskelige udgør, generering af tekst, styling af et billede med en anden, komponering af musik, tonehøjdeopdagelse, almindelige engelsksprogede ordforhold og meget mere. Mens TensorFlow.js primært er rettet mod dataforskere og udviklere, har ml5.js til formål at støtte bredere offentlig forståelse af maskinlæring og fremme dybere engagement med etisk databehandling, ansvarlig dataindsamling og tilgængelighed og mangfoldighed af mennesker og perspektiver inden for teknologi og kunst .

De fleste eksempler i ml5.js afhænger af TensorFlow.js-modeller. De er pakket som websider, som du kan køre som de er, eller redigere, for eksempel for at bruge forskellige billeder.

Demo: Irisklassificering med TensorFlow.js

Det berømte Iris diskrimination datasæt, der stammer fra R.A. Fisher i 1936 for at illustrere lineær diskriminerende analyse bruges stadig som en test case for statistiske og maskinindlæring klassificeringsmetoder. Det bruger fire træk, længden og bredden af ​​blomsterkronbladene og kronblade, til at klassificere tre arter af iris med 50 prøver af hver art. (Fishers originale papir blev offentliggjort i Annaler for eugenik, der siger mere om videnskab i 1936 end det gør om dataene eller statistikkerne.)

Hvis du udfører klyngeanalyse på disse data, deler to af arterne en klynge med den tredje (I. Setosa) i en separat klynge. På den anden side kan hovedkomponentanalyse adskille alle tre arter ret godt.

TensorFlow.js-prøven passer til Iris-dataene med to fuldt tilsluttede (tætte) neurale netværkslag som vist i kodeekstraktet nedenfor.

// Definer topologi af modellen: to tætte lag.

const model = tf.sequential ();

model.add (tf.layers.dense (

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

));

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

model.summary ();

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

model.compile ({

optimizer: optimizer,

tab: 'categoricalCrossentropy',

metrics: ['nøjagtighed'],

});

Som du kan se på skærmbilledet nedenfor, gør denne model et anstændigt stykke arbejde med at klassificere de tre arter. Hvis du leger med parametrene, vil du dog opdage, at en vis forvirring mellem to af arterne (dem i samme klynge) dukker op igen, hvis du gentager i mere end 40 epoker.

Konvertering af Python TensorFlow-modeller til JavaScript

En del af TensorFlow.js-arkivet indeholder en konverter til gemte TensorFlow- og Keras-modeller. Det understøtter tre formater: SavedModel (standard for TensorFlow), HDF5 (standard for Keras) og TensorFlow Hub. Du kan bruge konverteren til gemte modeller fra standardlagrene, modeller, du har trænet selv, og modeller, du har fundet andre steder.

Der er faktisk to trin til konverteringen. Det første trin er at konvertere den eksisterende model til model.json og binære vægtfiler. Det andet trin er enten at bruge en API til at indlæse modellen i TensorFlow.js tf.loadGraphModel til konverterede TensorFlow- og TensorFlow Hub-modeller eller tf.loadLayersModel til konverterede Keras-modeller.

Brug af transfer learning

TensorFlow.js understøtter transferlæring på stort set samme måde som TensorFlow. Dokumentationen indeholder eksempler til tilpasning af MobileNet til dine egne billeder og tilpasning af en model til talekommandogenkendelse til dine egne lydklasser. I det væsentlige er det, du laver i hver af disse kodelabs, at tilføje en lille brugerdefineret klassifikator oven på den uddannede model og træne det.

Samlet set kan TensorFlow.js gøre næsten alt, hvad TensorFlow kan gøre. I betragtning af at målmiljøerne for TensorFlow.js (havevarianter af GPU'er til spil) typisk har mindre i vejen for GPU-hukommelse end de store Nvidia-server-GPU'er, der typisk bruges til TensorFlow dyb læringstræning, skal du muligvis reducere størrelsen på model for at få den til at køre i en browser. Konverteringsværktøjet gør noget af dette for dig, men du bliver muligvis nødt til at tage lag ud manuelt og reducere batchstørrelserne til din træning.