さて、今回は番外編ということで”Courcera Machine Learning Week 4”より、非常に難解だったニューラルネットワークを少し応用して遊んでみたいと思います。
今回やりたいことは、
- 与えられたデータをトレーニング/テストセットに分けてモデルの精度確認
- 予測の結果、学習させたモデルによって間違えて予測した数字の表示
- ペイントで書いた数字を入力して予測!
というようなことをOctaveを使って行いたいと思います。
※前提として、Courcera Machine Learning Week 4の課題が終わっていることとします。もし終わっていない方はこっそり参考にしてください。
3.ペイントで書いた数字を入力
ということで、ニューラルネットワークを使って実際に自分の書いた数字の分類を行っていきましょう。
まずは手書き数字データの用意ですが、これにはだいたいのWindows PCに標準的にあるソフト、ペイントを使います。
ただやみくもにペイントで数字を書いて、画像データにしてモデルに突っ込んでも予測の精度は高くありません。予測精度を上げるためには手書き数字画像データに対して以下のちょっとした工夫が必要となります。
・学習に用いたデータサイズ(20ピクセル×20ピクセル)を用いる
・手書き数字をグレースケールに変換する
✔学習に用いたデータサイズ(20ピクセル×20ピクセル)を用いる
ペイントは”ホーム”タブの中にある”イメージ”から”サイズ変更”を選ぶと、ペイントができる白い所のサイズを自由に変更することができます。
サイズ変更の中の単位をピクセルに変え、水平方向、垂直報告をそれぞれ20にすることで画像サイズを20×20ピクセルとすることができます。
この設定を行うと、描ける範囲が狭くなるので少し扱い辛くなるのが難点です…
実際に数字を適当に書いてみましょう。よりモデル学習時のデータと似せるために背景を黒くして白い文字で数字を書きました。
作成した画像を保存しましょう。
✔手書き数字をグレースケールに変換する
次に作成した画像をOctaveで読み取りますが、その際に以下のようなコードで上手く読み込めました。
input_imgにimread関数で読み取り、uint8(mean(input_img,3))にてグレースケール変換しています。
input_img=imread("pic9.png");
grey_input=uint8(mean(input_img,3));
グレースケールに変換した画像データをこれまで作ったモデルで処理できる形にするためにreshapeで1×400の行列とします。
re_input=reshape(grey_input,1,400);
re_input=inputconv(double(re_input));
re_input=inputconv(double(re_input));
✔予測関数に手書き数字データを入力する。
ここまできたら、後はシータ1、2と一緒にPred関数に数値を入力するだけです。
次のようにします。
pred = predict(theta1, theta2, re_input)
displayData(re_input);
二行目は手書き数字データを表示させているだけです。
それでは、試しに私が書いたきったない字を入れてみましょう。
数字の”4”を書いたつもりです。
結果は….”9”!!!
確かに、人間の目からすると4ですが9に近いくないこともない。。。
これならどうだ…!
結果は…”4”!!
やっと当たりがでました!ちょっと楽しいです!
こんな感じで、自分が作ったニューラルネットワークで遊ぶことができます。
字が奇麗な人のサンプルを集めて学習させてやれば、下手な字を入力したときにはじかれてしまい、自分の字も上達するかもしれませんね!
以上です!
コメント