アラカン"BOKU"のITな日常

文系システムエンジニアの”BOKU”が勉強したこと、経験したこと、日々思うことを書いてます。

JavaScriptでディープラーニング:tf.kerasで学習済のモデルをTensorflow.jsで使える形式に変換する

面白いものがあるのに気づきました。

Tensorflow.js。

f:id:arakan_no_boku:20181012225145j:plain

簡単に言えば。

  • JavaScriptを使って、Tendorflowモデルを作成し学習・評価を行える。
  • JavaScriptを使って、既存のTensorFlowモデルをブラウザ実行できる。

ということ。

ブラウザで実行できるディープラーニング

ディープラーニングをWebアプリケーションの部品として使える感じです。

 

tf.kerasでsave()した学習済モデルをコンバートする

 

ほんとうなら。

Tensorflow.jsの使い方から覚えるべきなんでしょうが。

でも、その前に。

tf.kerasでsave()した学習済モデルを、どうやってJavaScriptで使える形にするのか?

これを確認しておきます。

その手順がとても面倒だったりすると嫌ですから。

その方法はこちらに書いてあります。

js.tensorflow.org

Importing a Keras model into TensorFlow.js

方法と手順はこんな感じです。

 

まず、準備。

 

Tensorflowのカレントバージョンがインストールされていることが前提です。

Tensorflowをインストールした環境をActiveにして以下をインストールします。

pip install tensorflowjs

Tensorflowのバージョンがカレントなら、上記を実行したら問題なくインストールされるはずです。

しかし、Tensorflowのバージョンが古いとうまくいきません。

例えば、現時点(2018/10/16)でカレントは1.11.0です。

でも、なんらかの理由でひとつ前の1.10.0を使い続けているとします。

そういう環境で上記を実行すると・・えらい目にあいます。

なんと、1.10.0のTensorflowがアンインストールされてしまいます(*_*)。

(自分がハマったから間違いないです)

注意が必要です。

インストールできたら、変換できるようになります。 

変換する方法は2種類あります。

 

変換方法その1

 

tf.kerasのsave()で、一旦h5ファイルを作成してから、そのファイルをコンバートする方法です。

h5ファイルを保存するところまでは、通常と同じです。

例えば、こんなソースの場合だと。

import tensorflow as tf

mnist = tf.keras.datasets.mnist

(x_train, y_train),(x_test, y_test) = mnist.load_data()
x_train, x_test = x_train / 255.0, x_test / 255.0

model = tf.keras.models.Sequential([
  tf.keras.layers.Flatten(),
  tf.keras.layers.Dense(512, activation=tf.nn.relu),
  tf.keras.layers.Dropout(0.2),
  tf.keras.layers.Dense(10, activation=tf.nn.softmax)
])
model.compile(optimizer=tf.keras.optimizers.Adam(),
              loss=tf.keras.losses.sparse_categorical_crossentropy,
              metrics=['accuracy'])

model.fit(x_train, y_train, epochs=2)
model.evaluate(x_test, y_test)
model.save('my_model.h5')

最終行のmodel.save('my_model.h5')の部分がそれにあたります。 

ただ、tensorflowの1.11.0では現在(2018/10/16)、save()がエラーになります。

arakan-pgm-ai.hatenablog.com

保存は他のバージョンでやってください。

成功すると「my_model.h5」というファイルができます。

変換は以下のコマンドを使います。

my_model.h5ファイルがあるフォルダをカレントディレクトリにして

tensorflowjs_converter --input_format keras my_model.h5 model

 とするわけです。

当然、上記のmy_model.h5の部分は、保存したファイル名です。

そうすると、カレントフォルダに「model」というフォルダが作られて、変換済のファイルが作成されています。

今回は以下の2つでした。

  • group1-shard1of1
  • model.json

Tensorflow.jsでモデルをloadするときには、このmodelフォルダの中身を静的アクセス可能なフォルダにおいて、「model.json」を指定すればいいみたいです。

こんな感じで。

const model = await tf.loadModel('http://foo.bar/model.json');

おーーー。

なんか、良さげ。

簡単だし。

ちなみに、Tensorflow1.10.0でsave()した「h5ファイル」を、Tensorflow1.11.0の「tensorflowjs_converter 」で何の問題なく変換できます。

 

変換方法その2

 

もう一つの変換方法は、Pythonからダイレクトに作成する方法です。

上記の「model.save()」のところを、以下に置き換えます。

tfjs.converters.save_keras_model(model, tfjs_target_dir)

 あ、もちろん、以下のimportを追加が必要ですけど。

import tensorflowjs as tfjs

 あと「tfjs_target_dir」には、osモジュールなどを使って、保存先のpathを渡します。

これを実行すると、さっきのmodelフォルダに作成されてような変換後モデルとjsonファイルが一発で作成される・・・はずです。

なぜ、はずです・・かというと。

現在(2018/10/16)のTensorflowの最新バージョンが1.11.0なので、tensorflowjsの上記のコマンドもエラーになって実行できないから、試せてないからです。

まあ・

そのうち、Tensorflowがアップデートされたら、ためしておきます。

 

なかなか使えそうです。

 

モデルの変換は楽でした。

超簡単といってもいいです。

昔、Tensorflow for java にモデルを変換して渡そうとしたときの苦労が嘘みたいに思えます。

arakan-pgm-ai.hatenablog.com

さすがに今は、for java向けもシンプルに変換できるようになっているんでしょうけど・・・、試してないので、なんとも。

とりあえず、試してみた感じ、変換の手順に問題はないです。

学習済モデルの変換や受け渡しもストレスなくやれそうなので、PHPとかと組み合わせると、いろいろ遊べそうな気がします。

tensorflow.jsで、今回変換したモデルを使って評価する手順を調べて、やってみたのはこちらです。

arakan-pgm-ai.hatenablog.com

ではでは。