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