機械学習初学者が短期間で
TENSORFLOWで作ったMNISTモデル
をANDROIDアプリに組み込んだ話
2018/01/16
まえすとろ
WHO AM I?
• Name: まえすとろ
• Androidエンジニアとして働いています
• 過去にOR系の業務をしていましたが…
• 大学院では純粋数学で作用素環論という分野を専攻。
• Twitter: @maestro_L_jp
今回話す内容
• 手書き画像(0-9)から数字を
推測するロジック(いわゆる
MNISTのモデル)をAndroid
端末上で動かすアプリ作りま
した。
• 数日でこれ作りました。。。(苦労した…)
デモ
• 今回はこのアプリを作るのに使った技術について話します。
• KerasによるTensorFlowモデルの作成
• TensorFlowモデルをAndroid上で動かすための方法
KerasによるTensorFlowモデルの作成
Kerasとは?
• TensorFlow, Theanoなどをバックエンドにとした、ニュー
ラルネット用ラッパーライブラリ。
• https://keras.io/ja/
• TensorFlowのAPIをそのまま使うより簡単でかつ直感的に
書ける!
• 初学者にはもってこい。
• Qiitaの記事とかみるとKerasを使ってサンプルあげてたりす
るものが結構ある。
• ちょっと発展したことをやろうとした時に、実践的な記
事から学んでアウトプットにすぐに反映させやすい。
「分類」を行う場合は、
ラベルは1次元から
「ラベルnに入る確信度」
を表す10次元のデータに変換。
Model.fitで実際の学習処理
を行うが、その前にModel自
体を確定するために
Model.complieを実行する。
• 学習したmodelを保存するにはModel#saveでパスを指定して
保存できる。
• ファイル形式はHDF5。(拡張子は.h5)
• Keras本体とは別にh5pyをインストールしないといけない。
• しかし、HDF5形式のモデルはTensorFlowでは直接は扱えな
い!
HDF5形式の
モデル
export load
• HDF5をTensorFlowで読める形式(pbファイル)に変換する必要
あり。
• https://github.com/icchi-h/keras_to_tensorflow
HDF5形式の
モデル
export
load
pb形式の
モデル
「KerasToTensorFlow」という
ライブラリで変換。
TensorFlowモデルをAndroid上で動かすための方法
tensorflow-androidを使う
• NDKのセットアップなしでTensorFlowモデルを
Android上で使えるようにするためのライブラリ。
• 2017年5月のGoogle I/O 2017で発表された。
tensorflow-androidの導入
• 1. build.gradleの設定する
この1行を追記
• 2. TensorFlowInferenceInterfaceオブジェクトを使ったクラス作成。
Feedに入力するべき値や、fetchに入力す
るべき値はh5のモデル変換時に出てきた
pb.asciiファイルに記載されているのでそ
こを参照にしていすること。
まとめ
• Kerasを使えば機械学習のコーディングとか慣れていなくても手っ取り
早く実装+検証ができる!
• tensorflow形式であればモデルのAndroidへの組み込みは容易になった。
• 今後、Keras+tensorflow-androidを使ってどんどん
機械学習を使ったアプリとか作っていきたい!
今回作ったアプリとスクリプトのURL
• MnistAndroid
• https://github.com/LyricalMaestro/MnistAndroid
• モデル生成スクリプト
• https://github.com/LyricalMaestro/tensor-flow-mnist-model-
for-android-maker
参考文献
• https://qiita.com/icchi_h/items/c37b52a3eb926d63f917
• https://qiita.com/yampy/items/706d44417c433e68db0d
• https://qiita.com/uramonk/items/c207c948ccb6cd0a1346

機械学習初学者が短期間でTensor flowで作ったmnistモデルをandroidアプリに組み込んだ話

Editor's Notes

  • #4 作った背景は、単純に興味本位です。
  • #11 仮に畳み込みレイヤーとか追加したいときはmodel.add(Convolution2D)
  • #20 作った背景は、単純に興味本位です。
  • #21 作った背景は、単純に興味本位です。
  • #22 作った背景は、単純に興味本位です。