Fukuoka.php Vol.24 で、手書き文字認識のデモをした話
2017/10/21 に、Fusic 社で Fukuoka.php Vol.24 が開催されました。
そこで、 ニューラルネットワークはじめました
というタイトルで発表させていただいたので、
発表内容を書いていきます。
なお、発表はデモ型式で行ったため、スライドの公開はしません。
ご了承ください。
発表内容
パート1
機械学習を行うにあたり、
どのようなフレームワーク・データ を利用するのか? という話をしました。
フレームワーク編
- TensorFlow (Google 製のフレームワーク)
- chainer (国産のフレームワーク。株式会社Preferred Networks 製)
- Theano (2017年末までに v. 1.0 が発表するらしい。詳しくは知らないですごめんなさい)
- kears (TensorFlow や Theano など複数のフレームワークをラッパーしてるいいやつ)
- caffe (難しい。)
- PyTorch (Facebook製? Twitter 見てる感じ、最近流行ってそう)
- PHP-ML (PHP製のフレームワーク)
データセット編
MNIST (手書き文字データ)
Iris (花の花弁数等のデータ)
CIFAR-10 (画像の10クラス分類)
MovieLens 1M (映画評価データ)
パート2
MNIST のデータセットを使って学習させたネットワークに、実際に手で書いた文字を入れ、
ちゃんと判定できるか? というデモを行いました。
※ こちらのサイトを3項にさせていただきました。
aidiary.hatenablog.com
やったことを列挙していきます。
1. 予め準備したニューラルネット をその場で学習させた
1. iPad Pro の GoodNotes というアプリを使い、 実際に数字を書いた
1. 書いた数字を画像として切り出して、Google Drive に上げた
1. その画像をPC 側から参照し、準備した jupyter notebook にアップロード
1. jupyter 内で画像のパスを指定し、画像を読み込み。
1. その際に、画像サイズを 28 * 28 * 1 にリサイズ
1. 学習した重みを使って、クラスを予測
1. 実際に聴衆の一人に文字を書いてもらい、同じことをもう一度やった
パート3
今回作ったニューラルネット は、 全結合層のみ利用したものだが、
CNNを使うともっと良くなりますよ ということを口頭で説明。
また、今回のニューラルネット は学習がすぐ(5秒程度) 終わったが、
実際はもっと時間がかかるケースがあることを説明 (長いものだと2週間とかかかる的な話。もっとかかるやつもあるだろうけど。)
更に詳しく調べたい人は、 fine tuning
でぐぐってくださいと、キーワードを提示
という感じで発表を行いました。
デモを作成するにあたって困ったこと
いくつかハマリポイントがあったが、最も辛かったのは、色の反転に気づけなかったこと。
まじでハマった。
何を言っているかというと、
MNIST の画像は、こんな感じになっている。
一方、読み取る画像のリサイズ前の状態はこんな感じ。
これを、28 x 28 x 1 にリサイズ
すると、こんな画像になる。
そう、白黒が反転している。
これに気づかず結構時間がかかった。
最終的に問題に気づいて、白黒を反転させると
このような画像ができた。
この画像をニューラルネット に投げると、うまく結果が出力された。
ハマって改めて感じたのは、データを見るのが大事だということ。
ちゃんとデータチェックしましょう。
[豆知識]
白黒反転した画像を入力したときにニューラルネット は、 すべての画像を5
と判定していた。
なぜそうなるのかは分からないが、どんな画像を入れても 5
だった。