如何在瀏覽器中使用TensorFlow?
譯文【51CTO.com快譯】雖然您可以借助TensorFlow用數(shù)量較少的訓(xùn)練數(shù)據(jù)來訓(xùn)練簡單的神經(jīng)網(wǎng)絡(luò),但對于擁有龐大訓(xùn)練數(shù)據(jù)集的深度神經(jīng)網(wǎng)絡(luò)而言,確實(shí)需要使用具有CUDA功能的英偉達(dá)GPU、谷歌TPU或FPGA進(jìn)行加速。就在不久前,替代方法一直是在CPU集群上訓(xùn)練數(shù)周。
TensorFlow 2.0引入的創(chuàng)新之一是JavaScript實(shí)現(xiàn):TensorFlow.js。我沒料到這會加快訓(xùn)練或推理速度,但確實(shí)如此,它通過WebGL API支持所有的GPU(不僅僅支持具有CUDA功能的GPU)。
TensorFlow.js簡介
TensorFlow.js是一個庫,用于使用JavaScript開發(fā)和訓(xùn)練機(jī)器學(xué)習(xí)模型,并將其部署在瀏覽器中或Node.js上。您可以使用現(xiàn)有模型、轉(zhuǎn)換Python TensorFlow模型、使用遷移學(xué)習(xí)用您自己的數(shù)據(jù)重新訓(xùn)練現(xiàn)有模型以及從頭開始開發(fā)模型。
TensorFlow.js后端
TensorFlow.js支持多個后端來執(zhí)行,不過每次只有一個后端處于活躍狀態(tài)。TensorFlow.js Node.js環(huán)境支持使用Python/C TensorFlow的安裝版本作為后端,TensorFlow反過來可能使用機(jī)器可用的硬件加速技術(shù),比如CUDA。還有面向Node.js的基于JavaScript的后端,但功能有限。
在瀏覽器中,TensorFlow.js有幾個特點(diǎn)不一的后端。WebGL后端使用面向存儲的WebGL紋理和面向執(zhí)行的WebGL著色器提供GPU支持,速度比普通CPU后端最多快100倍。 WebGL不需要CUDA,因此它可以充分利用現(xiàn)有的任何GPU。
瀏覽器版的WebAssembly(WASM)TensorFlow.js后端使用XNNPACK庫來優(yōu)化神經(jīng)網(wǎng)絡(luò)operator的CPU實(shí)現(xiàn)。WASM后端通常比JavaScript CPU后端快得多(快10倍至30倍),但除了超小模型外,通常比WebGL后端要慢。您的實(shí)際情況可能有所不同,因此請?jiān)谀约旱挠布厢槍ψ约旱哪P蜏y試WASM后端和WebGL后端。
TensorFlow.js模型和層
TensorFlow.js支持用于構(gòu)建神經(jīng)網(wǎng)絡(luò)模型的兩個API。一個是Layers API,與TensorFlow 2中的Keras API實(shí)際上一樣。另一個是Core API,它實(shí)際上直接操縱張量(tensor)。
與Keras一樣,TensorFlow.js Layers API有兩種創(chuàng)建模型的方法:順序型和功能型。順序型API是層的線性堆棧,通過層列表(如下所示)或model.add()方法來實(shí)現(xiàn):
- const model = tf.sequential({
- layers: [
- tf.layers.dense({inputShape: [784], units: 32, activation: 'relu'}),
- tf.layers.dense({units: 10, activation: 'softmax'}),
- ]
- });
功能型API使用tf.model() API,可創(chuàng)建任意的有向無環(huán)圖(DAG)網(wǎng)絡(luò):
- // Create an arbitrary graph of layers, by connecting them
- // via the apply() method.
- const input = tf.input({shape: [784]});
- const dense1 = tf.layers.dense({units: 32, activation: 'relu'}).apply(input);
- const dense2 = tf.layers.dense({units: 10, activation: 'softmax'}).apply(dense1);
- const model = tf.model({inputs: input, outputs: dense2});
Core API可使用不同的代碼實(shí)現(xiàn)同樣的目的,但與層之間沒有簡單直觀的聯(lián)系。以下的模型貌似基本的張量操作,但它創(chuàng)建與前兩個公式一樣的網(wǎng)絡(luò)。注意下面model()函數(shù)中使用的relu()和softmax(),這兩個都是神經(jīng)網(wǎng)絡(luò)操作。
- // The weights and biases for the two dense layers.
- 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]));
- function model(x) {
- return x.matMul(w1).add(b1).relu().matMul(w2).add(b2).softmax();
- }
預(yù)構(gòu)建的TensorFlow.js模型
存儲庫中記載了十多個預(yù)構(gòu)建的TensorFlow.js模型,它們托管在NPM(用于Node.js中)和unpkg(用于瀏覽器中)上。您可以使用所提供的這些模型或用于遷移學(xué)習(xí)。稍花點(diǎn)精力,您還可以將它們用作構(gòu)建其他模型的模塊。
其中一些模型實(shí)時使用設(shè)備的攝像頭,比如手姿勢:
圖1. 手姿勢可以檢測手掌,并跟蹤手骨骼手指。
以下列表介紹了大多數(shù)預(yù)包裝的TensorFlow.js模型,便于索引。
- 圖像分類
- 對象檢測
- 身體分割
- 姿勢估計(jì)
- 文本毒性檢測
- 通用句子編碼器
- 語音命令識別
- KNN分類器
- 簡單人臉檢測
- 語義分割
- 人臉標(biāo)志檢測
- 手姿勢檢測
- 自然語言問答
- ml5.js簡介
ml5.js是主要在紐約大學(xué)開發(fā)的一種對用戶友好的開源高級TensorFlow.js接口。ml5.js可在瀏覽器中立即訪問預(yù)訓(xùn)練的模型,以檢測人體姿勢、生成文本、用另一種樣式設(shè)置圖像、創(chuàng)作音樂、音高檢測和常用英語單詞關(guān)系等。TensorFlow.js主要針對數(shù)據(jù)科學(xué)家和開發(fā)人員,ml5.js則旨在支持公眾更廣泛地了解機(jī)器學(xué)習(xí)。
ml5.js中的大多數(shù)示例依賴TensorFlow.js模型。它們已包裝成網(wǎng)頁,您可以按原樣運(yùn)行或編輯它們,比如使用不同的圖像。
圖2. PoseNet可以在瀏覽器中根據(jù)圖像或視頻源執(zhí)行實(shí)時姿勢估計(jì)。
將Python TensorFlow模型轉(zhuǎn)換成JavaScript
TensorFlow.js存儲庫的一部分含有用于所保存的TensorFlow和Keras模型的轉(zhuǎn)換器。它支持三種格式:SavedModel(TensorFlow的默認(rèn)格式)、HDF5(Keras的默認(rèn)格式)和TensorFlow Hub。您可以將該轉(zhuǎn)換器用于標(biāo)準(zhǔn)存儲庫中的保存模型、自己訓(xùn)練的模型以及在別處找到的模型。
轉(zhuǎn)換實(shí)際上有兩個步驟。第一步是將現(xiàn)有模型轉(zhuǎn)換成model.json和二進(jìn)制權(quán)重文件。第二步是使用API將模型加載到TensorFlow.js中:使用面向轉(zhuǎn)換后的TensorFlow和TensorFlow Hub模型的tf.loadGraphModel,或者使用面向轉(zhuǎn)換后的Keras模型的tf.loadLayersModel。
使用遷移學(xué)習(xí)
TensorFlow.js支持遷移學(xué)習(xí),支持方式實(shí)際上與TensorFlow一樣。說明文檔給出了幾個示例,用于為您自己的圖像定制MobileNet,以及為您自己的聲音類定制語音命令識別模型。實(shí)際上,您在這每一個代碼實(shí)驗(yàn)室中所做的就是在訓(xùn)練后的模型上添加一個小小的自定義分類器,并對其進(jìn)行訓(xùn)練。
總體而言,TensorFlow能做的,TensorFlow.js基本上都能做。然而,鑒于TensorFlow.js的目標(biāo)環(huán)境(面向游戲的普通GPU)通常比常常用于TensorFlow深度學(xué)習(xí)訓(xùn)練的龐大英偉達(dá)服務(wù)器GPU擁有較少的GPU內(nèi)存,您可能不得不縮減模型的大小,以便在瀏覽器中運(yùn)行。轉(zhuǎn)換實(shí)用程序可以為您完成這部分工作,但是您要手動取出層,并縮減訓(xùn)練的批處理大小。
原文標(biāo)題:How to use TensorFlow in your browser,作者:Martin Heller
【51CTO譯稿,合作站點(diǎn)轉(zhuǎn)載請注明原文譯者和出處為51CTO.com】





























