TensorFlow.js : チュートリアル : TensorFlow SavedModel を TensorFlow.js にインポートする (翻訳/解説)
作成 : (株)クラスキャット セールスインフォメーション
日時 : 04/12/2018
* 本ページは、TensorFlow.js サイトの Tutorials – How to import a TensorFlow SavedModel into TensorFlow.js を翻訳した上で適宜、補足説明したものです:
* ご自由にリンクを張って頂いてかまいませんが、sales-info@classcat.com までご一報いただけると嬉しいです。
TensorFlow.js コンバータは事前訓練された TensorFlow SavedModel をブラウザにロードして TensorFlow.js を通して推論を実行するためのオープンソース・ライブラリです。
貴方のモデルをインポートする 2-段階プロセスです :
- TensorFlow SavedModel を web friendly フォーマットに変換するために python pip パッケージ。貴方が変換されたモデルを既に持つか、既にホストされたモデル (e.g. MobileNet) を使用している場合には、このステップはスキップしてください。
- ロードして推論を実行するための Javascript API (訳注: リンク切れ、おそらくは こちら)。
Step 1: SavedModel を web-friendly フォーマットに変換する
TensorFlow.js pip パッケージをインストールします :
$ pip install tensorflowjs
pip パッケージにより提供されるコンバータ・スクリプトを実行します :
使用方法:
$ tensorflowjs_converter \ --input_format=tf_saved_model \ --output_node_names='MobilenetV1/Predictions/Reshape_1' \ --saved_model_tags=serve /mobilenet/saved_model \ /mobilenet/web_model
位置変数 | 説明 |
input_path | セーブされたモデル・ディレクトリの完全パス。 |
output_dir | 総ての出力生成物のためのパス。 |
オプション | 説明 |
–input_format | 入力モデルのフォーマット。SavedModel のためには tf_saved_model を使用します。 |
–output_node_names | 出力ノードの名前、カンマで区切られます。 |
–saved_model_tags | ロードする MetaGraphDef のタグ、カンマ区切り形式。デフォルトは serve です。 |
Web-friendly フォーマット
上の変換スクリプトは 3 タイプのファイルを生成します :
- web_model.pb (the dataflow graph)
- weights_manifest.json (weight manifest file)
- group1-shard\*of\* (collection of binary weight files)
例えば、ここに変換されて次の位置でサービス提供されている MobileNet があります。
https://storage.cloud.google.com/tfjs-models/savedmodel/mobilenet_v1_1.0_224/optimized_model.pb https://storage.cloud.google.com/tfjs-models/savedmodel/mobilenet_v1_1.0_224/weights_manifest.json https://storage.cloud.google.com/tfjs-models/savedmodel/mobilenet_v1_1.0_224/group1-shard1of5 ... https://storage.cloud.google.com/tfjs-models/savedmodel/mobilenet_v1_1.0_224/group1-shard5of5
Step 2: ブラウザ内でロードして実行する
- tfjs-converter npm パッケージをインストールします。
yarn add @tensorflow/tfjs-converter or npm install @tensorflow/tfjs-converter
- FrozenModel クラス をインスタンス化して推論を実行します。
import * as tfc from '@tensorflow/tfjs-core'; import {loadFrozenModel} from '@tensorflow/tfjs-converter'; const MODEL_URL = 'https://.../mobilenet/web_model.pb'; const WEIGHTS_URL = 'https://.../mobilenet/weights_manifest.json'; const model = await loadFrozenModel(MODEL_URL, WEIGHTS_URL); const cat = document.getElementById('cat'); model.execute({input: tfc.fromPixels(cat)});
私達の動作する MobileNet デモ を確かめてください。
貴方のサーバがモデル・ファイルにアクセスするための credentials をリクエストする場合は、オプションの RequestOption param を提供できます。
const model = await loadFrozenModel(MODEL_URL, WEIGHTS_URL, {credentials: 'include'});
詳細は fetch() ドキュメント を見てください。
サポートされる演算
現在のところ TensorFlow.js は TensorFlow Ops の限定的なセットをサポートするだけです。完全なリスト を見てください。もし貴方のモデルがサポートされていない ops を使用しているのであれば、tensorflowjs_converter スクリプトは失敗して貴方のモデル内のサポートされていない ops のリストを生成します。
FAQ
- コンバータはどの TensorFlow モデルを現在サポートしていますか?
画像ベースのモデル (MobileNet, SqueezeNet, 貴方がテストすれば更に追加します) が最もサポートされています。制御フロー ops (e.g. RNNs) を伴うモデルはまだサポートされていません。tensorflowjs_converter スクリプトは貴方が持つモデルを検証してモデル内でサポートされていない ops のリストを示します。どの ops が現在サポートされているかのためには このリスト を見てください。 - 巨大な重みを持つモデルは動作しますか?
ブラウザが 100-500MB モデルのロードをサポートする一方で、ページ・ロード時間、推論時間そしてユーザ経験は素晴らしいものではないでしょう。エッジデバイス (e.g. 電話) のためにデザインされたモデルを使用することを推奨します。これらのモデルは通常は 30 MB よりも小さいです。 - モデルと重みファイルはブラウザ内にキャッシュされますか?
はい、私達は重みを 4 MB チャンクのファイルに分割し、これはブラウザにそれらを自動的にキャッシュすることを可能にします。モデル・アーキテクチャが 4 MB 未満 (殆どのモデルがそうです) である場合、それもまたキャッシュされるでしょう。 - それは量子化を伴うモデルをサポートしますか?
まだです。量子化サポートをまもなく追加することを計画しています。 - 推論のための predict() メソッドの最初の呼び出しは、続く呼び出しよりも何故非常に遅いのでしょう?
最初の呼び出し時はまたモデルのための WebGL シェーダー・プログラムのコンパイル時間も含みます。最初の呼び出し後にはシェーダー・プログラムはキャッシュされ、これは続く呼び出しを遥かに高速にします。モデル・ローディングの完了のすぐ後に、predict メソッドを総てゼロの入力で呼び出すことによりキャッシュをウォームアップすることができます。
開発
TensorFlow.js コンバータをソースからビルドするには、プロジェクトを clone して dev 環境を準備する必要があります :
$ git clone https://github.com/tensorflow/tfjs-converter.git $ cd tfjs-converter $ yarn # Installs dependencies.
開発のために Visual Studio Code を使用することを推奨します。TSLint VSCode エクステンション と npm clang-format 1.2.2 またそれ以上を自動フォーマッティングのための Clang-Format VSCode と共に確実にインストールしてください。
pull リクエストを提出する前に、コードが総てのテストをパスして lint エラーがないことを確認してください :
$ yarn test $ yarn lint
テストのサブセットを and/or 特定のブラウザ上で実行するには :
$ yarn test --browsers=Chrome --grep='execute' > ... > Chrome 64.0.3282 (Linux 0.0.0): Executed 39 of 39 SUCCESS (0.129 secs / 0 secs)
テストを一度実行して karma プロセスを抜けるためには (Windows 上で有用です) :
$ yarn test --single-run
以上