Programavimas

Kaip naudoti „TensorFlow“ savo naršyklėje

Nors naudodamiesi „TensorFlow“ galite mokyti paprastus neuroninius tinklus su palyginti nedideliais treniruočių duomenų kiekiais, giliems neuroniniams tinklams, turintiems didelius mokymo duomenų rinkinius, greitėjimui iš tikrųjų reikia naudoti „Cvida“ palaikančius „Nvidia“ GPU arba „Google TPU“ arba FPGA. Dar visai neseniai alternatyva buvo treniruotis procesorių grupėse kelias savaites.

Viena iš „TensorFlow 2.0“ pristatytų naujovių yra „JavaScript“ diegimas „TensorFlow.js“. Nesitikėjau, kad tai pagerins treniruočių ar spėjimo greitį, tačiau taip yra, atsižvelgiant į tai, kad palaiko visus GPU (ne tik su CUDA suderinamus GPU) per „WebGL“ API.

[Taip pat: „TensorFlow 2.0“ apžvalga: lengvesnis mašininis mokymasis]

Kas yra TensorFlow.js?

„TensorFlow.js“ yra biblioteka, skirta kurti ir mokyti mašininio mokymosi modelius naudojant „JavaScript“ ir diegiant juos naršyklėje arba „Node.js“. Galite naudoti esamus modelius, konvertuoti „Python TensorFlow“ modelius, naudoti perkėlimo mokymą, kad esamus modelius perkvalifikuotumėte su savo duomenimis, ir kurti modelius nuo nulio.

„TensorFlow.js“ galas baigiasi

„TensorFlow.js“ palaiko kelis galinius vykdymo galus, nors vienu metu gali būti aktyvus tik vienas. „TensorFlow.js Node.js“ aplinka palaiko įdiegtos „Python / C TensorFlow“ versijos naudojimą kaip galinę dalį, kuri savo ruožtu gali naudoti galimą mašinos aparatūros pagreitį, pavyzdžiui, CUDA. „Node.js“ taip pat yra „JavaScript“ pagrindu sukurta galinė dalis, tačiau jos galimybės yra ribotos.

Naršyklėje „TensorFlow.js“ turi keletą galinių galų, turinčių skirtingas charakteristikas. „WebGL“ galinė dalis teikia GPU palaikymą, naudodama „WebGL“ tekstūras saugojimui ir „WebGL shader“ vykdymui, ir gali būti iki 100 kartų greitesnė už paprastą procesoriaus galinę dalį. „WebGL“ nereikia CUDA, todėl jis gali pasinaudoti bet kokiu GPU.

Naršyklės „WebAssembly“ (WASM) „TensorFlow.js“ gale naudojama XNNPACK biblioteka optimizuotam neuroninių tinklo operatorių procesoriaus įgyvendinimui. WASM galinė dalis paprastai yra daug greitesnė (nuo 10 iki 30 kartų) nei „JavaScript“ procesoriaus galinė dalis, tačiau paprastai yra lėtesnė nei „WebGL“ galinė dalis, išskyrus labai mažus modelius. Jūsų rida gali skirtis, todėl naudodami savo aparatinę įrangą išbandykite savo modelių WASM ir „WebGL“ galus.

„TensorFlow.js“ modeliai ir sluoksniai

„TensorFlow.js“ palaiko dvi sąsajas neuroninių tinklų modeliams kurti. Vienas iš jų yra „Layers API“, kuris iš esmės yra tas pats, kas „Keras“ API, esantis „TensorFlow 2“. Kitas yra „Core API“, kuris iš esmės yra tiesioginis manipuliavimas tenzoriais.

Kaip ir „Keras“, „TensorFlow.js“ sluoksnių API turi du būdus sukurti modelį: nuoseklų ir funkcinį. Nuoseklioji API yra tiesinė sluoksnių krūva, įgyvendinta su sluoksnių sąrašu (kaip parodyta žemiau) arba su model.add () metodas:

const modelis = tf.sequential ({

sluoksniai: [

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

tf.layers.dense ({vienetai: 10, aktyvinimas: 'softmax'}),

 ]

});

Funkcinė API naudoja tf.model () API ir gali sukurti savavališkus DAG (nukreipto aciklinio grafiko) tinklus:

// Sukurkite savavališką sluoksnių grafiką, juos susiedami

// taikant metodą taikyti ().

const įvestis = tf. įvestis ({forma: [784]});

const dense1 = tf.layers.dense ({vienetai: 32, aktyvinimas: 'relu'}). taikyti (įvestis);

const dense2 = tf.layers.dense ({vienetai: 10, aktyvinimas: 'softmax'}). taikyti (tankus1);

const modelis = tf.model ({įėjimai: įvestis, išėjimai: tankus2});

„Core API“ gali pasiekti tuos pačius tikslus, naudodamas skirtingą kodą ir mažiau intuityviai susiejant sluoksnius. Žemiau pateiktas modelis gali atrodyti kaip pagrindinės tenzoriaus operacijos, tačiau jis sukuria tą patį tinklą kaip ir dvi ankstesnės formuluotės. Atkreipkite dėmesį į relu () ir softmax (), kurios yra ir neuroninio tinklo operacijos, modelis() funkcija žemiau.

// Dviejų tankių sluoksnių svoriai ir poslinkiai.

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

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

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

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

funkcijos modelis (x) {

grąžinti x.matMul (w1) .add (b1) .relu (). matMul (w2) .add (b2) .softmax ();

}

Iš anksto sukurti „TensorFlow.js“ modeliai

Yra daugiau nei keliolika iš anksto sukurtų „TensorFlow.js“ modelių, kurie yra dokumentuoti, prieinami saugykloje ir priglobti NPM (skirti naudoti „Node.js“) ir „unpkg“ (skirti naudoti naršyklėje). Šiuos modelius galite naudoti kaip pridedamus arba mokytis perkeldami. Atlikdami šiek tiek darbo, galite juos naudoti ir kaip kitų modelių statybines medžiagas.

Keletas šių modelių realiuoju laiku naudoja įrenginio kamerą, pavyzdžiui, naudoja rankiniu būdu:

Žemiau pateiktas sąrašas yra patogus daugelio fasuotų „TensorFlow.js“ modelių indeksas.

  • Vaizdų klasifikacija
  • Objektų aptikimas
  • Kūno segmentavimas
  • Pozos įvertinimas
  • Toksiškumo tekstui nustatymas
  • Universalus sakinių koduotojas
  • Kalbos komandų atpažinimas
  • KNN klasifikatorius
  • Paprastas veido aptikimas
  • Semantinis segmentavimas
  • Veido orientyrų aptikimas
  • Rankų pozos aptikimas
  • Atsakymas į natūralios kalbos klausimą

Kas yra ml5.js?

„ml5.js“ yra atviro kodo, draugiška, aukšto lygio „TensorFlow.js“ sąsaja, pirmiausia sukurta NYU. „ml5.js“ suteikia galimybę naršyklėje nedelsiant naudotis iš anksto paruoštais modeliais, skirtais žmogaus pozoms aptikti, tekstui generuoti, vaizdui su kitu kurti, muzikai kurti, pikio aptikimui, bendrinės angliškos kalbos žodžių santykiams ir daugeliui kitų. Nors „TensorFlow.js“ pirmiausia skirtas duomenų mokslininkams ir kūrėjams, „ml5.js“ siekia paremti platesnį visuomenės supratimą apie mašininį mokymąsi ir skatinti gilesnį įsitraukimą į etinį skaičiavimą, atsakingą duomenų rinkimą, žmonių prieinamumą ir įvairovę bei technologijų ir meno perspektyvas .

Dauguma pavyzdžių, esančių ml5.js, priklauso nuo „TensorFlow.js“ modelių. Jie buvo supakuoti kaip tinklalapiai, kuriuos galite paleisti tokie, kokie yra, arba redaguoti, pavyzdžiui, norint naudoti skirtingus vaizdus.

Demonstracija: „Iris“ klasifikacija su „TensorFlow.js“

Garsusis „Iris“ diskriminacijos duomenų rinkinys, kurį sukūrė R.A. Fišeris 1936 m. Iliustruoti linijinę diskriminacinę analizę vis dar naudojamas kaip bandomasis statistinių ir mašininio mokymosi klasifikavimo metodų pavyzdys. Klasifikuojant tris vilkdalgių rūšis, kiekvienai rūšiai priskiriant po 50 pavyzdžių, naudojamos keturios ypatybės - gėlių taurėlapių ir žiedlapių ilgis ir plotis. (Fisherio originalus straipsnis buvo paskelbtas Eugenikos metraščiai, kuris daugiau pasakoja apie mokslą 1936 m., nei apie duomenis ar statistiką.)

Jei atliksite šių duomenų grupių analizę, dvi rūšys pasidalins vienu grupe, o trečioji (I. Setosa) - atskiroje grupėje. Kita vertus, pagrindinė komponentų analizė gali gana gerai atskirti visas tris rūšis.

„TensorFlow.js“ pavyzdys atitinka „Iris“ duomenis su dviem visiškai sujungtais (tankiais) neuroninio tinklo sluoksniais, kaip parodyta žemiau esančiame kodo ištraukoje.

// Apibrėžkite modelio topologiją: du tankūs sluoksniai.

const modelis = tf.tarpinė ();

model.add (tf.layers.dense (

{vienetai: 10, aktyvinimas: 'sigmoid', inputShape: [xTrain.shape [1]]}

));

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

modelis.apibendrinimas ();

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

model.compile ({

optimizatorius: optimizatorius,

nuostolis: „kategoriška kryžminė kopija“,

metrika: ['tikslumas'],

});

Kaip matote paveikslėlyje žemiau, šis modelis tinkamai padaro tris rūšis. Tačiau jei žaisite su parametrais, pastebėsite, kad pasikartojant daugiau nei 40 epochų vėl atsiranda tam tikra dviejų rūšių (tų pačių grupių) painiava.

„Python TensorFlow“ modelių konvertavimas į „JavaScript“

Dalyje „TensorFlow.js“ saugyklos yra keitiklis, skirtas išsaugotiems „TensorFlow“ ir „Keras“ modeliams. Jis palaiko tris formatus: „SavedModel“ (numatytasis „TensorFlow“), HDF5 (numatytasis „Keras“) ir „TensorFlow Hub“. Galite naudoti keitiklį išsaugotiems modeliams iš standartinių saugyklų, modeliams, kuriuos mokėte patys, ir modeliams, kuriuos radote kitur.

Iš tikrųjų yra du konversijos veiksmai. Pirmasis žingsnis yra konvertuoti esamą modelį į model.json ir dvejetainio svorio failus. Antrasis žingsnis yra naudoti API, kad įkeltumėte modelį į „TensorFlow.js“ tf.loadGraphModel konvertuotiems „TensorFlow“ ir „TensorFlow Hub“ modeliams arba tf.loadLayersModel konvertuotiems „Keras“ modeliams.

Mokymosi perkėlimas

„TensorFlow.js“ palaiko perkėlimą iš esmės taip pat, kaip ir „TensorFlow“. Dokumentuose pateikiami pavyzdžiai, kaip pritaikyti „MobileNet“ savo atvaizdams ir pritaikyti kalbos komandų atpažinimo modelį jūsų pačių garso klasėms. Iš esmės tai, ką darote kiekviename iš šių kodelių, prideda mažą pasirinktinį klasifikatorių ant apmokyto modelio ir tai moko.

Apskritai „TensorFlow.js“ gali padaryti beveik viską, ką gali „TensorFlow“. Tačiau atsižvelgiant į tai, kad tikslinėse „TensorFlow.js“ (žaidimų sodo veislės GPU) aplinkose GPU atmintis paprastai būna mažesnė nei didelių „Nvidia“ serverio GPU, paprastai naudojamų gilaus mokymosi „TensorFlow“ mokymams, gali tekti sumažinti savo modelį, kad jis veiktų naršyklėje. Konversijos įrankis daro tai kai ką už jus, tačiau gali tekti rankiniu būdu išimti sluoksnius ir sumažinti mokymų partijų dydžius.