見出し画像

KerasモデルをTensorFlow.jsにインポートする

1. HDF5ファイル

「Kerasモデル」は、model.save(filepath)を使うことで,単一のHDF5ファイルに保存できます。このHDF5ファイルは以下を含みます。

・再構築可能なモデルの構造
・モデルの重み
・学習時の設定 (loss,optimizer)
・optimizerの状態

2. TensorFlow.js Layers format

HDF5ファイルは、TensorFlow.jsのコンバータを使うことで、HDF5ファイルを「TensorFlow.js Layers format」に変換できます。これは、推論またはさらなる訓練のために「TensorFlow.js」に直接ロードできる形式です。

「TensorFlow.js Layers format」は、1つの「model.json」と複数の「重みファイル」を含むフォルダとして出力されます。「model.json」には、トポロジー(レイヤーの説明と接続方法)と重みのマニフェストが含まれています。

3. HDF5ファイルの作成

MobileNetのHDF5ファイルの作成手順は次のとおりです。

(1) Pythonの仮想環境の準備。
今回はAnacondaでPythonの仮想環境を準備します。

$ conda create -n tensorflowjs python=3.6
$ conda activate tensorflowjs

(2) TensorFlowのインストール
TensorFlowに含まれるKerasを利用します。

$ pip install tensorflow==2.1.1

(3) 「create_model.py」を作成し、実行します。

# Python

from tensorflow.keras.applications.mobilenet import MobileNet
INPUT_SHAPE = (128, 128, 3)
model = MobileNet(weights='imagenet', include_top=True, input_shape=INPUT_SHAPE)
model.save('model.h5')
$ python create_model.py

「model.h5」が生成されます。

4. HDF5ファイルをTensorFlow.js Layers formatに変換

(1) TensorFlow.jsのパッケージをインストール。

$ pip install tensorflowjs==1.7.3

(2) コンバータの実行
HDF5ファイル「model.h5」をTensorFlow.js Layers formatに変換します。

$ tensorflowjs_converter --input_format keras model.h5 jsmodel

フォルダ「jsmodel」が出力されます。

jsmodelmodel.jsongroup1-shard1of5.bingroup1-shard2of5.bingroup1-shard3of5.bingroup1-shard4of5.bingroup1-shard5of5.bin

5. TensorFlow.js Layers formatをTensorFlow.jsに読み込む

Webサーバーを使用して、変換済みモデルファイルを読み込みます。JavaScriptでファイルを読み込めるようにするため、Cross-Origin Resource Sharing(CORS)を許可するようにサーバーの設定が必要な場合があります。

「model.json」のURLを指定して、変換済みモデルファイルをTensorFlow.jsに読み込みます。

// JavaScript

import * as tf from '@tensorflow/tfjs';
const model = await tf.loadLayersModel('https://foo.bar/jsもでl/model.json');

これで、モデルは推論、評価、または再訓練の準備ができました。たとえば、読み込まれたモデルはすぐに予測に使用できます。

// JavaScript

const example = tf.fromPixels(webcamElement);
const prediction = model.predict(example);

TensorFlow.jsのサンプルの多くは、Google Cloud Storage上で変換されてホストされている学習済みモデルを使用しています。

「model.json」を使用してモデル全体を参照することに注意してください。
loadModel(...)は「model.json」を読み込んでから、「model.json」で参照される分割された「重みファイル」を取得します。これによって、通常のキャッシュファイルサイズの制限よりも小さくすることで、すべてのファイルをブラウザにキャッシュできるようにしています。そのため、モデルは2回目以降はより速く読み込まれる可能性があります。

6. サポートされている機能

「TensorFlow.js Layers format」は現在、「Kerasモデル」のみをサポートしています。サポートされていないオペレーションまたはレイヤーを使用するモデル(カスタムレイヤー、Lambdaレイヤー、カスタム損失、カスタムメトリックなど)は、JavaScriptに確実に変換できないPythonコードに依存しているため、自動的にインポートできません。

【おまけ】 Python APIを使用してTensorFlow.js Layers formatに直接エクスポート

PythonにKerasモデルがある場合は、次のようにTensorFlow.js Layers formatに直接エクスポートできます。

import tensorflowjs as tfjs

def train(...):
    model = keras.models.Sequential() 
    ...
    model.compile(...)
    model.fit(...)
    tfjs.converters.save_keras_model(model, tfjs_target_dir)


この記事が気に入ったらサポートをしてみませんか?