Programování

Jak používat TensorFlow ve vašem prohlížeči

I když můžete trénovat jednoduché neuronové sítě s relativně malým množstvím tréninkových dat pomocí TensorFlow, pro hluboké neuronové sítě s velkými tréninkovými datovými sadami opravdu potřebujete pro akceleraci použít GPU Nvidia s podporou CUDA nebo Google TPU nebo FPGA. Alternativou bylo donedávna několik týdnů trénovat na klastrech CPU.

Jednou z inovací zavedených v TensorFlow 2.0 je implementace JavaScriptu, TensorFlow.js. Nečekal bych, že to vylepší trénink nebo odvodí rychlost, ale díky podpoře všech GPU (nejen GPU s podporou CUDA) prostřednictvím rozhraní WebGL API ano.

[Také na: Recenze TensorFlow 2.0: Snadnější strojové učení]

Co je TensorFlow.js?

TensorFlow.js je knihovna pro vývoj a školení modelů strojového učení v JavaScriptu a jejich nasazení v prohlížeči nebo na Node.js. Můžete použít existující modely, převést modely Python TensorFlow, použít transfer learning k rekvalifikaci existujících modelů s vašimi vlastními daty a vyvíjet modely od nuly.

Zadní konce souboru TensorFlow.js

TensorFlow.js podporuje více backendů pro provádění, i když současně může být aktivní pouze jeden. Prostředí TensorFlow.js Node.js podporuje použití nainstalovaného sestavení Python / C TensorFlow jako back-end, což může zase využívat dostupnou hardwarovou akceleraci stroje, například CUDA. K dispozici je také back-end založený na JavaScriptu pro Node.js, ale jeho možnosti jsou omezené.

V prohlížeči má TensorFlow.js několik backendů s různými vlastnostmi. Zadní část WebGL poskytuje podporu GPU pomocí textur WebGL pro úložiště a shaderů WebGL pro provádění a může být až 100krát rychlejší než běžný zadní konec CPU. WebGL nevyžaduje CUDA, takže může využívat jakékoli přítomné grafické karty.

Zadní část WebAssembly (WASM) TensorFlow.js pro prohlížeč používá knihovnu XNNPACK pro optimalizovanou implementaci CPU operátorů neurální sítě. Zadní část WASM je obecně mnohem rychlejší (10x až 30x) než zadní část CPU JavaScriptu, ale je obvykle pomalejší než zadní část WebGL, s výjimkou velmi malých modelů. Váš počet najetých kilometrů se může lišit, proto otestujte rozhraní WASM i WebGL pro své vlastní modely na svém vlastním hardwaru.

Modely a vrstvy TensorFlow.js

TensorFlow.js podporuje dvě API pro vytváření modelů neuronových sítí. Jedním z nich je Layers API, které je v podstatě stejné jako rozhraní Keras API v TensorFlow 2. Druhým je Core API, což je v podstatě přímá manipulace s tenzory.

Stejně jako Keras má rozhraní TensorFlow.js Layers API dva způsoby, jak vytvořit model: sekvenční a funkční. Sekvenční API je lineární stoh vrstev, implementovaný pomocí seznamu vrstev (jak je znázorněno níže) nebo pomocí model.add () metoda:

const model = tf.sequential ({

vrstvy: [

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

tf.layers.dense ({jednotky: 10, aktivace: 'softmax'}),

 ]

});

Funkční API používá tf.model () API a může vytvářet libovolné sítě DAG (směrovaný acyklický graf):

// Vytvořte libovolný graf vrstev jejich spojením

// pomocí metody apply ().

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

const hustá1 = tf.layers.dense ({jednotky: 32, aktivace: 'relu'}). apply (vstup);

const hustá2 = tf.layers.dense ({jednotky: 10, aktivace: 'softmax'}). apply (hustá1);

const model = tf.model ({vstupy: vstup, výstupy: thick2});

Core API může dosáhnout stejných cílů, s odlišným kódem a méně intuitivní vazbou na vrstvy. Níže uvedený model může vypadat jako základní tenzorové operace, ale vytváří stejnou síť jako dvě předchozí formulace. Všimněte si použití relu () a softmax (), což jsou obě operace neuronových sítí, v Modelka() funkce níže.

// Váhy a předpětí pro dvě husté vrstvy.

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

funkční model (x) {

návrat x.matMul (w1) .add (b1) .relu (). matMul (w2) .add (b2) .softmax ();

}

Předpřipravené modely TensorFlow.js

Je zdokumentováno více než tucet předem připravených modelů TensorFlow.js, které jsou k dispozici v úložišti a jsou hostovány na NPM (pro použití v Node.js) a unbkg (pro použití v prohlížeči). Tyto modely můžete použít jako součást dodávky nebo pro přenos učení. S trochou práce je můžete také použít jako stavební kameny pro další modely.

Některé z těchto modelů používají kameru zařízení v reálném čase, například pro ruční použití:

Níže uvedený seznam představuje vhodný index do většiny předbalených modelů TensorFlow.js.

  • Klasifikace obrazu
  • Detekce objektů
  • Segmentace těla
  • Odhad pozice
  • Detekce textové toxicity
  • Univerzální kodér vět
  • Rozpoznávání řečových příkazů
  • KNN klasifikátor
  • Jednoduchá detekce obličeje
  • Sémantická segmentace
  • Detekce orientačních bodů obličeje
  • Detekce pozice rukou
  • Odpovědi na otázky v přirozeném jazyce

Co je ML5.js?

ml5.js je otevřené, přátelské rozhraní na vysoké úrovni k TensorFlow.js vyvinuté primárně na NYU. ml5.js poskytuje v prohlížeči okamžitý přístup k předem vyškoleným modelům pro detekci lidských póz, generování textu, stylizaci obrazu pomocí jiného, ​​skládání hudby, detekci výšky tónu, běžné slovní vztahy v angličtině a mnoho dalšího. Zatímco TensorFlow.js je zaměřen primárně na datové vědce a vývojáře, ml5.js si klade za cíl podporovat širší veřejné chápání strojového učení a podporovat hlubší spolupráci s etickým výpočtem, odpovědným sběrem dat a přístupností a rozmanitostí lidí a perspektiv v oblasti technologií a umění .

Většina příkladů v ml5.js závisí na modelech TensorFlow.js. Byly zabaleny jako webové stránky, které můžete spouštět tak, jak jsou, nebo je upravovat, například pro použití různých obrázků.

Demo: Klasifikace Iris pomocí TensorFlow.js

Slavný soubor údajů o diskriminaci duhovky, který vytvořil R.A. Fisher v roce 1936 pro ilustraci lineární diskriminační analýzy se stále používá jako testovací případ pro statistické metody a metody klasifikace strojového učení. Využívá čtyři funkce, délku a šířku květinových lístků a okvětních lístků, ke klasifikaci tří druhů kosatců s 50 vzorky od každého druhu. (Fisherův původní dokument byl publikován v Annals of Eugenics, který říká více o vědě v roce 1936 než o datech nebo statistikách.)

Pokud na těchto datech provedete klastrovou analýzu, dva druhy budou sdílet jeden klastr a třetí (I. Setosa) v samostatném klastru. Na druhou stranu může analýza hlavních složek docela dobře oddělit všechny tři druhy.

Ukázka TensorFlow.js zapadá do dat Iris se dvěma plně propojenými (hustými) vrstvami neurální sítě, jak je ukázáno v níže uvedeném extraktu kódu.

// Definujte topologii modelu: dvě husté vrstvy.

const model = tf.sequential ();

model.add (tf.layers.dense (

{jednotky: 10, aktivace: 'sigmoid', inputShape: [xTrain.shape [1]]}

));

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

model.summary ();

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

model.compile ({

optimalizátor: optimalizátor,

ztráta: 'categoricalCrossentropy',

metriky: ['přesnost'],

});

Jak můžete vidět na následujícím obrázku, tento model slušně pracuje při klasifikaci těchto tří druhů. Pokud si ale pohrajete s parametry, zjistíte, že při iteraci více než 40 epoch se znovu objeví zmatek mezi dvěma druhy (těmi ve stejné skupině).

Převod modelů Python TensorFlow na JavaScript

Část úložiště TensorFlow.js obsahuje převaděč pro uložené modely TensorFlow a Keras. Podporuje tři formáty: SavedModel (výchozí pro TensorFlow), HDF5 (výchozí pro Keras) a TensorFlow Hub. Převaděč můžete použít pro uložené modely ze standardních úložišť, modely, které jste sami proškolili, a modely, které jste našli jinde.

Ve skutečnosti existují dva kroky k převodu. Prvním krokem je převod existujícího modelu na model.json a soubory binární váhy. Druhým krokem je použití API k načtení modelu do TensorFlow.js tf.loadGraphModel pro převedené modely TensorFlow a TensorFlow Hub nebo tf.loadLayersModel pro převedené modely Keras.

Pomocí přenosu učení

TensorFlow.js podporuje přenos učení v podstatě stejným způsobem jako TensorFlow. Dokumentace poskytuje příklady přizpůsobení MobileNet pro vaše vlastní obrázky a přizpůsobení modelu pro rozpoznávání řečových příkazů pro vaše vlastní zvukové třídy. V zásadě to, co děláte v každém z těchto kodexů, je přidání malého vlastního klasifikátoru nad trénovaný model a jeho procvičení.

Celkově TensorFlow.js dokáže téměř cokoli, co dokáže TensorFlow. Vzhledem k tomu, že cílová prostředí pro TensorFlow.js (zahradní odrůdy GPU pro hraní her) mají obvykle méně paměti GPU než GPU velkých serverů Nvidia, které se obvykle používají pro trénink hlubokého učení TensorFlow, možná budete muset zmenšit velikost vašeho model, aby byl spuštěn v prohlížeči. Obslužný program pro převod za vás provede něco z toho, ale možná budete muset ručně odebrat vrstvy a zmenšit velikost dávky pro váš trénink.