gorogoroyasu

福岡の開発会社で働いている。

Fukuoka.php Vol.24 で、手書き文字認識のデモをした話

2017/10/21 に、Fusic 社で Fukuoka.php Vol.24 が開催されました。
そこで、 ニューラルネットワークはじめました というタイトルで発表させていただいたので、
発表内容を書いていきます。

なお、発表はデモ型式で行ったため、スライドの公開はしません。
ご了承ください。

発表内容

パート1

機械学習を行うにあたり、
どのようなフレームワーク・データ を利用するのか? という話をしました。

フレームワーク

  1. TensorFlow (Google 製のフレームワーク)
  2. chainer (国産のフレームワーク株式会社Preferred Networks 製)
  3. Theano (2017年末までに v. 1.0 が発表するらしい。詳しくは知らないですごめんなさい)
  4. kears (TensorFlow や Theano など複数のフレームワークをラッパーしてるいいやつ)
  5. caffe (難しい。)
  6. PyTorch (Facebook製? Twitter 見てる感じ、最近流行ってそう)
  7. 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 の画像は、こんな感じになっている。
f:id:adiboy:20171026194940p:plain

一方、読み取る画像のリサイズ前の状態はこんな感じ。
f:id:adiboy:20171026195035p:plain

これを、28 x 28 x 1 にリサイズ
すると、こんな画像になる。
f:id:adiboy:20171026195228p:plain

そう、白黒が反転している。

これに気づかず結構時間がかかった。
最終的に問題に気づいて、白黒を反転させると
f:id:adiboy:20171026195129p:plain

このような画像ができた。

この画像をニューラルネット に投げると、うまく結果が出力された。

ハマって改めて感じたのは、データを見るのが大事だということ。
ちゃんとデータチェックしましょう。

[豆知識]
白黒反転した画像を入力したときにニューラルネット は、 すべての画像を5 と判定していた。 なぜそうなるのかは分からないが、どんな画像を入れても 5 だった。