ブラウザでTensorFlowを使用する方法

TensorFlowを使用すると、比較的少量のトレーニングデータで単純なニューラルネットワークをトレーニングできますが、トレーニングデータセットが大きいディープニューラルネットワークでは、加速のためにCUDA対応のNvidia GPU、Google TPU、またはFPGAを使用する必要があります。代替案は、最近まで、CPUのクラスターで数週間トレーニングすることでした。

TensorFlow 2.0で導入されたイノベーションの1つは、JavaScriptの実装であるTensorFlow.jsです。トレーニングや推論の速度が向上するとは思っていませんでしたが、WebGL APIを介してすべてのGPU(CUDA対応GPUだけでなく)をサポートしていることを考えると、向上します。

[また、TensorFlow 2.0レビュー:より簡単な機械学習]

TensorFlow.jsとは何ですか?

TensorFlow.jsは、JavaScriptで機械学習モデルを開発およびトレーニングし、それらをブラウザーまたはNode.jsにデプロイするためのライブラリです。既存のモデルを使用したり、Python TensorFlowモデルを変換したり、転移学習を使用して既存のモデルを独自のデータで再トレーニングしたり、モデルを最初から開発したりできます。

TensorFlow.jsバックエンド

TensorFlow.jsは、実行用に複数のバックエンドをサポートしていますが、一度にアクティブにできるのは1つだけです。TensorFlow.js Node.js環境は、インストールされたPython / C TensorFlowのビルドをバックエンドとして使用することをサポートします。これにより、CUDAなどのマシンで利用可能なハードウェアアクセラレーションを使用できます。Node.js用のJavaScriptベースのバックエンドもありますが、その機能は制限されています。

ブラウザでは、TensorFlow.jsにはさまざまな特性を持ついくつかのバックエンドがあります。WebGLバックエンドは、ストレージ用のWebGLテクスチャと実行用のWebGLシェーダーを使用してGPUサポートを提供し、プレーンCPUバックエンドよりも最大100倍高速になります。WebGLはCUDAを必要としないため、GPUが存在する場合はそれを利用できます。

ブラウザ用のWebAssembly(WASM)TensorFlow.jsバックエンドは、ニューラルネットワークオペレータの最適化されたCPU実装のためにXNNPACKライ​​ブラリを使用します。WASMバックエンドは一般にJavaScriptCPUバックエンドよりもはるかに高速(10倍から30倍)ですが、非常に小さなモデルを除いて、通常はWebGLバックエンドよりも低速です。マイレージは異なる場合があるため、WASMとWebGLの両方のバックエンドを、独自のハードウェアで独自のモデルに対してテストしてください。

TensorFlow.jsモデルとレイヤー

TensorFlow.jsは、ニューラルネットワークモデルを構築するための2つのAPIをサポートしています。1つはLayersAPIで、これは基本的にTensorFlow2のKerasAPIと同じです。もう1つはCoreAPIで、基本的にテンソルを直接操作します。

Kerasと同様に、TensorFlow.js Layers APIには、モデルを作成する2つの方法があります。シーケンシャルと機能です。シーケンシャルAPIは、レイヤーの線形スタックであり、レイヤーリスト(以下に示す)または次のmodel.add()メソッドで実装されます。

const model = tf.sequential({

 レイヤー:[

   tf.layers.dense({inputShape:[784]、units:32、activation: 'relu'})、

   tf.layers.dense({units:10、activation: 'softmax'})、

 ]

});

機能APIはAPIを使用し、tf.model()任意のDAG(有向非巡回グラフ)ネットワークを作成できます。

//レイヤーを接続して、レイヤーの任意のグラフを作成します

// apply()メソッドを介して。

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

constdensity1 = tf.layers.dense({units:32、activation: 'relu'})。apply(input);

constdensity2 = tf.layers.dense({units:10、activation: 'softmax'})。apply(dense1);

const model = tf.model({inputs:input、outputs:dense2});

Core APIは、異なるコードで同じ目標を達成でき、レイヤーとの直感的な結びつきが少なくなります。以下のモデルは基本的なテンソル演算のように見えるかもしれませんが、前の2つの定式化と同じネットワークを作成します。以下の関数では、どちらもニューラルネットワーク操作であるrelu()との使用に注意してください。softmax()model()

// 2つの密なレイヤーの重みとバイアス。

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

関数model(x){

  x.matMul(w1).add(b1).relu()。matMul(w2).add(b2).softmax();を返します。

}

ビルド済みのTensorFlow.jsモデル

文書化され、リポジトリで利用可能で、NPM(Node.jsで使用するため)およびunpkg(ブラウザーで使用するため)でホストされる、12を超えるビルド済みのTensorFlow.jsモデルがあります。これらのモデルは、提供されているとおりに、または転移学習に使用できます。少しの作業で、他のモデルのビルディングブロックとして使用することもできます。

これらのモデルのいくつかは、デバイスのカメラをリアルタイムで使用します。たとえば、handpose:

以下のリストは、ほとんどのパッケージ済みTensorFlow.jsモデルへの便利なインデックスです。

  • 画像分類
  • 物体検出
  • 体節制
  • ポーズ推定
  • テキスト毒性の検出
  • ユニバーサルセンテンスエンコーダ
  • 音声コマンド認識
  • KNN分類器
  • シンプルな顔検出
  • セマンティックセグメンテーション
  • 顔のランドマーク検出
  • 手のポーズ検出
  • 自然言語の質問応答

ml5.jsとは何ですか?

ml5.jsは、主にNYUで開発されたTensorFlow.jsへのオープンソースで使いやすい高レベルのインターフェースです。ml5.jsは、人間のポーズの検出、テキストの生成、別の画像のスタイリング、音楽の作成、ピッチ検出、一般的な英語の単語の関係など、事前にトレーニングされたモデルへのブラウザでの即時アクセスを提供します。TensorFlow.jsは主にデータサイエンティストと開発者を対象としていますが、ml5.jsは機械学習の幅広い一般の理解をサポートし、倫理的なコンピューティング、責任あるデータ収集、テクノロジーと芸術における人々と視点のアクセス可能性と多様性へのより深い関与を促進することを目的としています。 。

ml5.jsの例のほとんどは、TensorFlow.jsモデルに依存しています。これらは、そのまま実行したり、編集して別の画像を使用したりできるWebページとしてパッケージ化されています。

デモ:TensorFlow.jsによるアイリス分類

線形判別分析を説明するために1936年にRAフィッシャーによって作成された有名なアイリス判別データセットは、統計および機械学習の分類方法のテストケースとして現在も使用されています。花のがく片と花びらの長さと幅の4つの特徴を使用して、3種のアイリスを分類し、各種のサンプルを50個使用します。(Fisherの元の論文は、Annals of Eugenicsに掲載されました。これは、データや統計よりも1936年の科学について詳しく説明しています。)

このデータに対してクラスター分析を実行すると、2つの種が1つのクラスターを共有し、3番目(I. Setosa)が別のクラスターになります。一方、主成分分析では、3つの種すべてをかなりうまく分離できます。

TensorFlow.jsサンプルは、以下のコード抽出に示すように、2つの完全に接続された(密な)ニューラルネットワークレイヤーにアイリスデータを適合させます。

//モデルのトポロジを定義します:2つの密なレイヤー。

const model = tf.sequential();

model.add(tf.layers.dense(

{ユニット:10、アクティベーション: 'シグモイド'、inputShape:[xTrain.shape [1]]}

));

model.add(tf.layers.dense({units:3、activation: 'softmax'}));

model.summary();

constoptimizer = tf.train.adam(params.learningRate);

model.compile({

オプティマイザー:オプティマイザー、

損失: 'categoricalCrossentropy'、

メトリック:['精度']、

});

下のスクリーンショットでわかるように、このモデルは3つの種を分類するのに適切な仕事をします。ただし、パラメーターをいじってみると、40エポックを超えて反復すると、2つの種(同じクラスター内の種)の間で混乱が再び発生することがわかります。

PythonTensorFlowモデルをJavaScriptに変換する

TensorFlow.jsリポジトリの一部には、保存されたTensorFlowモデルとKerasモデルのコンバーターが含まれています。SavedModel(TensorFlowのデフォルト)、HDF5(Kerasのデフォルト)、TensorFlowHubの3つの形式をサポートしています。コンバーターは、標準リポジトリーから保存されたモデル、自分でトレーニングしたモデル、および他の場所で見つけたモデルに使用できます。

変換には実際には2つのステップがあります。最初のステップは、既存のモデルをmodel.jsonおよびバイナリウェイトファイルに変換することです。2番目のステップは、APIを使用して、tf.loadGraphModel変換されたTensorFlowおよびTensorFlow Hubモデル、または変換されたKerasモデルのいずれかでモデルをTensorFlow.jsにロードすることtf.loadLayersModelです。

転移学習の使用

TensorFlow.jsは、TensorFlowと基本的に同じ方法で転移学習をサポートします。ドキュメントには、独自の画像用にMobileNetをカスタマイズし、独自のサウンドクラス用に音声コマンド認識用のモデルをカスタマイズするための例が記載されています。基本的に、これらの各コードラボで行っているのは、トレーニング済みモデルの上に小さなカスタム分類子を追加し、それをトレーニングすることです。

全体として、TensorFlow.jsは、TensorFlowが実行できるほとんどすべてのことを実行できます。ただし、TensorFlow.js(ゲーム用のガーデンバラエティGPU)のターゲット環境では、通常、TensorFlowディープラーニングトレーニングに通常使用される大きなNvidiaサーバーGPUよりもGPUメモリの量が少ないため、サイズを縮小する必要がある場合があります。ブラウザで実行するためのモデル。変換ユーティリティはこれの一部を実行しますが、手動でレイヤーを取り出し、トレーニングのバッチサイズを減らす必要がある場合があります。