これは Jupyter Advent Calendar 2017の第1日目の記事です。
経緯
手書き数字の識字率がめちゃくちゃ高いという話は聞いたことあったけど、
自分で書いた文字を識別させたことはなかったので、
いい機会だと思い、デモを作った。
環境
jupyter-notebook は、 ubuntu docker 上で起動している。
python -V
Python 3.6.2
使うライブラリ等
import numpy as np
import fileupload
import matplotlib.pyplot as plt
import ipywidgets as widgets
from IPython.display import display
from PIL import Image
from keras.models import model_from_json
jupyter widgets
file upload と button widgets を利用している。
https://qiita.com/driller/items/0730325bf5c1cd689979
https://qiita.com/shinya7/items/745486ef2dae61ae49ca
とてもわかり易く書いてあるので、このあたりを参考にインストールすると良い。
(widgets を使わない場合、少しコードの修正が必要になる。)
事前準備
3層のニューラルネットを作って、学習させた。
ネットワークはこんな感じ。
Dense(512, relu) -> Dense(512, relu) -> (10, sigmoid)
ライブラリには、Keras を使用した。
本デモでは、事前にトレーニングした重みを読み込み利用している。
コード
コードは、gist に登録している。
https://gist.github.com/gorogoroyasu/76cffe71ac828e29d43580cea201d0f4
(上述の通り、widgets が必要)
デモ
デモは、jupyter を使って行った。
必要なボタンは、以下の3つ。
browser
これで、ファイルを探してくる。
iPad Pro の GoodNotes というアプリを使って手書き文字を書き、
ファイルを Google Drive にアップロードした。
アップロードしたファイルをjupyter から探すというしかけ。
また、アップロードしたファイルは、下記のとおり前処理を行った。
画像をチェックする (オプション)
入力した画像とニューラルネットに入れる画像をチェックすることができる。
予想する
このボタンを押したら、ニューラルネットが入力された画像を予想してくれる。
前処理
画像に対して、
- グレースケール
- リサイズ
- 白黒反転
という処理を行った。
特に、白黒反転をしなくてはならないことを知らなかったので、焦った。
感想
widgets が、とても便利でした。
lambda
を乱用しなくてはならないのが難点ですが、
基本的にはとても使いやすかったです。
毎回 shift + enter
を押して実行する必要もないし、
なんか、見た目もかっこよくなるし。
ただ、Browser
ボタンを押してアップロードする前に予測する
ボタンを押しちゃうとエラーになっちゃったりするので、
その辺を改善する必要はありそうです。
できるんだろうけど。
ということで、実際に動くdocker 環境を作っときます。
作ったら追記させて頂きます〜。
以上です。
Advent Calendar、盛り上げていきましょう!!