Chainerで手書き数字の識別(MNIST)

今回は、DeepLearningフレームワークのChainerを試してみます。
手書き数字を識別してみよう、ということでMNISTというデータを使います。
MNISTとは手書き数字画像とそれが何の数字かのラベルがたくさん入っているデータです。
それをDeepLearningすることで手書き数字を識別できるようになります。
また、Chainerに初めて触ったので学習の部分はサンプルコードにやってもらいます。

1.Chainerの準備

まずはChainerを使えるようにしましょう。
pipでChainerを入れます

$ pip install chainer

Chainerのサンプルコードをダウンロードします。

$ git clone https://github.com/chainer/chainer.git

(zipファイルでダウンロードしてもいいです。 https://github.com/chainer/chainer)

2.サンプルコードを実行

ダウンロードしたファイルの中にサンプルコードがあるのでとりあえず実行してみましょう

$ cd chainer/examples/mnist
$ python train_mnist.py

こんな画面が出ます、上のインジケータが100%になれば終了です。

sshなどで端末だけを操作している時にno DISPLAYエラーが出る場合があります。
その場合matplotlibrcファイルを一部書き換える必要があります。
以下のコマンドでpythonインタプリタからファイルの位置を確認して、

以下のように書き換えましょう。

- backend : TkAgg
+ backend : Agg

これで問題がなければ動くはずです。
必要モジュールが足りないときは適宜インストールしてください。
終了後にresultフォルダにグラフ画像などができています。

3.サンプルコードの学習モデルで画像識別をする

ただ学習しただけだと、数値とグラフが出ているだけでDeepLearningできた気がしない!
というわけで手書き文字を読み込んで識別するプログラムを作ってみます。
まず、サンプルコードの後ろの方に学習モデルを保存するコードを追加します。

追記後にもう一度サンプルコードを実行すると、同フォルダにtrain_mnist.modelができていると思います。
これが先程学習したモデルになります。

モデルと画像を読み込んで、識別結果を出すプログラムが以下になります。

モデルのクラスは保存したときと同じ必要があるらしいため、サンプルコードからの流用です。

また、読み込む画像サイズは28×28の必要があります。

ペイントで書いたこの画像を読み込んだところ、3と正しく結果が出力されました!
他にもいろいろ試し、正答率はまあまあ高かったですが7がうまく識別できませんでした。

今回は画像の識別でしたが、他のDeepLearningにも触れてみたいものですね。

成田哲洋

最近親知らずを抜きました。