こんにちは、今回は前回に引き続き、プログラミング言語Juliaで機械学習のニューラルネットワークの実装をやってみたいとおもいます。前回の記事は以下を参照ください。
Juliaによる画像処理〜ニューラルネットワークpart1〜
Juliaによる画像処理〜ニューラルネットワークpart1〜
1. 今回すること
今回は前回の続きで手書き文字の識別をやっていきます。前回の内容から以下のように識別機が生成され、ファイルが作られたとおもいます。これを用いて新しい手書き文字に関して識別することが今回の目標です。
2. データの準備
今回は自分の書いた手書き文字の検出をします。白い紙に好きな数字を書いて、それを判別できたら嬉しいですよね!今回は以下のような写真を用意しました。
今回のinputdataは(28,28)の大きさの画像です。なので、これの大きさを変える必要があります。
ImageJでやっていきましょう。なお、画像を得るための方法は以下を参照ください。
30秒でわかる画像処理 #03 画像の切り出し、サイズ調整
https://www.youtube.com/watch?v=LIHC0N4IGEk&feature=youtu.be
まず画像をdrag&dropでImageJから起動します。そのあと、8の周りを四角で囲みcropをし、それをImage->Scaleから変更。さらにImage->Adjust->Thresholdから白黒画像にすればOKです。なお、閾値を決めずにScaleを変えた画像を用いてももちろん識別できます。以下のプログラムでは二つの画像を識別してみました。
これで、下のような画像が得られたと思います!
ImageJでやっていきましょう。なお、画像を得るための方法は以下を参照ください。
30秒でわかる画像処理 #03 画像の切り出し、サイズ調整
https://www.youtube.com/watch?v=LIHC0N4IGEk&feature=youtu.be
まず画像をdrag&dropでImageJから起動します。そのあと、8の周りを四角で囲みcropをし、それをImage->Scaleから変更。さらにImage->Adjust->Thresholdから白黒画像にすればOKです。なお、閾値を決めずにScaleを変えた画像を用いてももちろん識別できます。以下のプログラムでは二つの画像を識別してみました。
これで、下のような画像が得られたと思います!
手書き文字を扱うデータにした。
3. ニューラルネットワークで作られた識別器
前回のプログラムにより、識別器("snapshots/snapshot-010000.jld")ができたと思います。これを用いてまずはうまく作動するかどうかを調べてみましょう。
まずはこれでsnapshotを読み出します。
これにより、HDF5形式で保存されているデータを読み出し、識別器にかけています。今回は200番目のデータの文字が何に属されるのかをチェックしています。
実行してみると、
実行してみると、
このようになり、識別器としてうまく機能していることがチェックできました!
これを使えば手書き文字の識別ができそうですね!
これを使えば手書き文字の識別ができそうですね!
4. Juliaで手書き文字の読み込み
なお、注意しなければいけないのは、学習データは白色で文字を書いているということで、画素は0-1の大きさで変動し、黒色は0であるということです。学習データとデータの形を合わせる必要があります。これのチェックはサンプルデータを出力させるとみることができます。
上のコードでprintln(kk)のコメントアウトを外してみると、画像がどのように配列で表されているかをチェックすることができます。
今、手書き画像を読み出すと、
上のコードでprintln(kk)のコメントアウトを外してみると、画像がどのように配列で表されているかをチェックすることができます。
今、手書き画像を読み出すと、
という結果になります。これは値の幅が-127から127となっていて、白が-127として表されていることに注意です。
もともとのデータと同じにするため、このデータを以下のように変換します。
もともとのデータと同じにするため、このデータを以下のように変換します。
こうすると、データの形が同じになります!面倒臭いので自動的にデータの形式を揃えてくれるものがあればなあ。
4. 実行結果
それでは実行してみましょう。
このような結果が得られ、8番目である確率が最も高いですよ、という結果になっています。判別できていますね。
今回のサンプルプログラムを実行することで、ニューラルネットワークを大まかにどのようにプログラムすればよいのかわかったと思います。次回ではまた別のサンプルを実行してみようと思います。
今回のサンプルプログラムを実行することで、ニューラルネットワークを大まかにどのようにプログラムすればよいのかわかったと思います。次回ではまた別のサンプルを実行してみようと思います。