『coremltools』を使って「Keras」で作った学習モデルをコンバートしてみた

『coremltools』を使って「Keras」で作った学習モデルをコンバートしてみた

ソフトバンク・au・ドコモの方は、公式のオンラインショップを利用すれば頭金不要で通常のショップよりお得に購入できます。

ricemanさん執筆の記事を読んでいたら、急な無茶振りが飛んできた “新人開発員・中村くん” こと、紅孔雀です。

今回の記事がbitWave初投稿。ナマ暖かい目で見守って下さいませ。

iOSで「Keras」のモデルを動かそう

本記事のタイトル通り、機械学習のモデルを「Core ML」を使ってコンバートするまでをご紹介いたします。

『coremltools』は「Keras」や「Caffe」で作った学習モデルをiOSでも実行できるようサポートしてくれるPythonライブラリです。

『coremltools』の良いところは、学習済みのモデルをそのままiOSに流用できるファイルに変換してくれる点に尽きます。
そして、読み込んだ “重みデータ” 込みの学習モデルは一つの関数のように扱えるため、非常にカンタンにアプリに実装することが可能になります。

そのあたりをカバーする「Core ML」の詳しい説明やiOS回りの新しい変更はricemanさんの記事をご参照ください。
<bitWave関連記事『「iOS11」新搭載の「Core ML」を駆使して、MNISTの手書き数字認識を試してみた』>

では、早速コンバートしてみましょう。

『coremltools』をインストールする

まずは『coremltools』をpipでインストールしましょう。
これがないと始まりませんね

# pip install -U coremltools

<参照:Python Software Foundation『coremltools 0.3.0』(英語サイト)>

それから、この検証には学習済みの学習モデルを用意する必要があります。
今回は「Keras」のチュートリアルにもあるようなMNIST数字認識のモデルを試してみましょう。

学習モデルを作る

初めにデータ学習用のデータ用意します。
「Keras」のライブラリからダウンロードできるのでこれを使ってみましょう。
学習ができるように少しデータ整理していきます。

from keras.datasets import mnist
(X_train, y_train), (X_test, y_test) = mnist.load_data()

# 画像を1次元配列化
X_train = X_train.reshape(60000, 784)
X_test = X_test.reshape(10000, 784)
# 画素を0.0-1.0の範囲に変換
X_train = X_train.astype('float32')
X_test = X_test.astype('float32')
X_train /= 255
X_test /= 255

from keras.models import Sequential
from keras.layers import Dense, Activation
from keras.optimizers import SGD
from keras.utils import np_utils
#教師データをone-hot表現へ
y_train = np_utils.to_categorical(y_train, 10)
y_test = np_utils.to_categorical(y_test, 10)

ここで実践した学習について詳しく説明すると、記事一つできあがってしまうため、あえて省略させていただきます。
続いてモデルの定義です。

model = Sequential()
model.add(Dense(10, input_dim=784))
model.add(Activation('softmax'))

sgd = SGD(lr=0.1, decay=1e-6, momentum=0.9, nesterov=True)
model.compile(loss='categorical_crossentropy',
              optimizer=sgd,
              metrics=['accuracy'])
model.fit(X_train, y_train,
          nb_epoch=20,
          batch_size=16)

こちらは単純な数字認識のモデルですね。
サクッと動かすことが目的なので、今回は精度なんて全然考慮していません。
最後に学習データを “重みデータ付き” で保存するようにします。

model.save('my_model.h5')

早速、学習してみましょう。
予想ではそんなに時間はかからないハズ……です。

mlmodelにコンバート

なんと、以下のプログラミングだけで「Core ML]用のモデルファイルに変換できます!

import coremltools
coreml_model =coremltools.converters.keras.convert('my_model.h5')
#ちなみに直接kerasのモデルを指定することもできます。
coreml_model =coremltools.converters.keras.convert(model)

coreml_model.save('my_model.mlmodel')

できあがったmlmodelをiPhoneアプリの開発環境に渡してあげましょう。
これなら学習したモデルと学習した “重みデータ” をまとめて渡すことができます。
ここから先は再びricemanさんの記事をご参照ください。

とにもかくにも、非常にカンタンに「Keras」のモデルをiPhone上で動かすためのmlmodelファイルにコンバートすることができました。

ただ一つ注意しておかなければならないことは、「core ML」が対応している「Keras」のバージョンが1.2.2までということです。

現在(2017年6月時点)の「Keras」の最新バージョンは2.0.2となっており、旧バージョンから仕様変更がありました。
特に「1系」と「2系」とでモデルを保存した時のデータの形式が大幅に変わってしまっているため、「1系」で作り直す必要があるんですね。
また、バックエンドがTensorFlowの時だけ有となっており、Theanoでは『coremltools』ライブラリそのものがインポートできない点も注意が必要です。

「coreML」の可能性

iPhone単体で機械学習のモデルが実行可能になったのは、やはり大きな利点でしょう。
ディープラーニングだけで無く、他の機械学習系ライブラリも変換可能であることも大きな点です。

iPhoneにはカメラやマイクだけでなく、様々なセンサーが搭載されています。
これらと学習モデルを組み合わせることで、日常生活上でも便利なアプリの開発が簡単になるのではないでしょうか?
まだ「ベータ版」とのことなので、動作がちょっぴり不安定なのはご愛嬌です。

ソフトバンク・au・ドコモの方は、公式のオンラインショップを利用すれば頭金不要で通常のショップよりお得に購入できます。

【週刊bitWave】(メルマガ)始めました!

登録はこちらからメールアドレスを入力してお申込みください。

ご登録いただいたメールアドレスは 【週刊bitWave】の更新情報の配信にのみ使用します。

個人情報の取扱いに関しては、「プライバシーポリシー」をご確認ください。解除はいつでもこちらから行うことが可能です。

あなたにおすすめ