TensorFlowでのMNIST学習結果を、実際に手書きして試す

Deep Learningという言葉を色んなところで聞くようになり、Googleからも TensorFlow というものが出たし、そろそろちょっと勉強してみるか〜 ということで初心者が機械学習に手を出してみた。

TensorFlowのtutorialを見てみると、まず最初に「MNIST」という手書き文字の識別問題が出てくる。その問題に対して、こういうモデルを作ってこうやって学習させていくと91.2%くらいの識別率になります、さらに飛躍させてこういうモデルでこうやって学習させると99.2%くらいまで識別率が上がります、とか書いてあって、確かになるほどーと数字で納得もできるのだけど、せっかくなら実際にその学習結果を使って自分の書いた数字を識別してもらいたいじゃないか、ということで そういうのを作ってみた。

canvasにマウスで自由に線を書くとそれを入力として(使用しているモデルに合わせて28x28にリサイズして)サーバに送り、MNIST用に学習したモデルたちがそれぞれどういう判定を返したか、を返して結果を表示する。

使用しているのはtutorialで出てくる、単純なロジスティック回帰を用いた単層のもの(識別率約91.2%)と、多層畳み込みニューラルネットワークのもの(識別率約99.2%)。

これをそれぞれMNISTのデータからある程度まで学習させて、それぞれの変数をdumpしておき、Webアプリではそれを読み込んで使うだけ。
実際に数字を書いてみると多層畳み込みのものの方がどれだけ精度が高いかを実感できる。Deep Learningすげー。

余談

せっかくWebアプリにしているんだからHerokuにでも上げて誰でも試せるようにしたい、と思ったのだけど、現時点ではTensorFlowがHerokuのPython buildpack上では動かないらしい。

python - undefined symbol: PyUnicodeUCS4_FromStringAndSize with tensorflow on heroku - Stack Overflow

これによると既に最新のソースコードでは解決しているそうなので、自前でpipパッケージをビルドすれば出来るのでは、とのことだったけど dockerでheroku/pythonの環境を作ってbazelやらswigやらinstallしてビルドしてみようとしたものの結局うまくビルドできず、断念した… tensorflowの次のバージョンがreleaseされるのを待っておこうと思います…

余談2

なんとなく今まで使ったことないものを使ってみよう、と思ってフロント側のJSをES2015で書いてGulpでwatchしつつ変更のたびにbabelで変換して適当にcompressして、みたいにしてみた。
まだ全然慣れないけど 最近のフロントエンド開発ってこんな感じなのかなー、と。

Deep Learningについて

ググると色んな解説記事などがあってありがたい。

とか特に丁寧に解説があって深層学習ってのがどういうことなのか、とかそれなりに理解できたような気がします。
まだまだ分かっていないことも多いけど 次は顔識別とか試してみたいなーと思っています。