http://d.hatena.ne.jp/thorikawa/20090908/p1
出来たんだけど
腹減りすぎて、発表せずに退散してしまいました。
(っていうか、人前で発表するの苦手です。)
実装経験少ない人向けに、書いてみました。
環境:
- OS:Windows2000
- Visual Studio 2005 (C++)
- R v2.9
- OpenCV 1.0
上の環境は、あらかじめインストール済みです。
MNISTの手書き文字から学習データ準備の後追い
OpenCV処理は順調
VC環境設定
- 文字コード:設定なし(ユニコードめんどくさい)
- インクルードファイルの設定 OpenCV\CV\include、otherlibs\highgui、cxcore\include
- ライブラリの設定 OpenCV\lib
あと、C:\opencv\binのdllファイルを実行ファイルと同じ所にコピペしないと動かない
さて、次は学習プログラムをRで作成開始するが難航した。
はじめは、オリジナル画像で学習を行った。
パラメータも同じにした。
画像の枚数は以下のとおり
読み方はmnist_test数字.jpg xCount:水平方向の枚数 yCount:垂直方向の枚数
mnist_train0.jpg xCount = 31 yCount = 32 mnist_train1.jpg xCount = 34 yCount = 34 mnist_train2.jpg xCount = 32 yCount = 33 mnist_train3.jpg xCount = 32 yCount = 32 mnist_train4.jpg xCount = 31 yCount = 32 mnist_train5.jpg xCount = 30 yCount = 30 mnist_train6.jpg xCount = 31 yCount = 31 mnist_train7.jpg xCount = 32 yCount = 33 mnist_train8.jpg xCount = 31 yCount = 32 mnist_train9.jpg xCount = 32 yCount = 32
1時間以上経過しても終わんない。
仕方ないので
Rで書かれた学習関数(learn.r)のパラメータ数を減らした。
ソースは thorikawaさんblog見てください。
----------------------------------------- #number of hidden unit 省略 save(w1, w2, logsumexp, softmax, neuro_func, file="C:\\src\\readybinary_img\\release\\nnet_image.rdata")まで -----------------------------------------
ただし、
MAX_EPOCH 1000を100
#sample 1000 training data
sample_index = sample(1:nrow(digit_data), 1000)
の1000を100に減らした。
Rのコンソール上で
source(c:\\パス\\learn.r)って入力してリターンすれば学習開始される。
それでも終わらないので
mnist_train0.jpg xCount = 7 yCount = 8 mnist_train1.jpg xCount = 8 yCount = 8 mnist_train2.jpg xCount = 8 yCount = 8 mnist_train3.jpg xCount = 8 yCount = 8 mnist_train4.jpg xCount = 7 yCount = 8 mnist_train5.jpg xCount = 7 yCount = 7 mnist_train6.jpg xCount = 7 yCount = 7 mnist_train7.jpg xCount = 8 yCount = 8 mnist_train8.jpg xCount = 7 yCount = 8 mnist_train9.jpg xCount = 8 yCount = 8
にしてようやく1時間以内で学習終える 13:30ごろ
nnet_image.rdataをエディタで開くと、バイナリっぽい。
テストプログラムの作成着手
ソースは thorikawaさんblog見てください。
テストプログラムってところ。
これもエディタで記述して、拡張子rで保存
Rコンソール上でsource(c:\\パス\\test.r)って入力してリターン
時間かかるのが予想されたので
テストデータは、少なめに設定
【test data detail】 mnist_test0.jpg xCount = 3 yCount = 4 mnist_test1.jpg xCount = 4 yCount = 4 mnist_test2.jpg xCount = 4 yCount = 4 mnist_test3.jpg xCount = 4 yCount = 4 mnist_test4.jpg xCount = 3 yCount = 4 mnist_test5.jpg xCount = 3 yCount = 3 mnist_test6.jpg xCount = 3 yCount = 3 mnist_test7.jpg xCount = 4 yCount = 4 mnist_test8.jpg xCount = 3 yCount = 4 mnist_test9.jpg xCount = 4 yCount = 4
にした
■結果 MNIST画像幅/8の場合
correct case= 107 , wrong case = 26
correct rate = 80%
じゃあ少し多めにしたら、結構時間かかった
【test data detail】 mnist_test0.jpg xCount = 7 yCount = 8 mnist_test1.jpg xCount = 8 yCount = 8 mnist_test2.jpg xCount = 8 yCount = 8 mnist_test3.jpg xCount = 8 yCount = 8 mnist_test4.jpg xCount = 7 yCount = 8 mnist_test5.jpg xCount = 7 yCount = 7 mnist_test6.jpg xCount = 7 yCount = 7 mnist_test7.jpg xCount = 8 yCount = 8 mnist_test8.jpg xCount = 7 yCount = 8 mnist_test9.jpg xCount = 8 yCount = 8
■結果 MNIST画像幅/4の場合
correct case= 3579 , wrong case = 581
correct rate = 86%
正解率は少し上がった。
わかったこと
画素を特徴にした学習は、時間がかかりすぎる
だから、認識系のアプリは実用に耐えるように
画素以外の特徴(次元圧縮)で学習させている(・・・のかな?)
Rの文法とかOpenCVの関数とかよくわからなくても
とりあえず半日あれば、動かせる。
動きを見てみて、教科書のみの勉強会よりは
体感できるので、なんとなくわかるような気がした。(あくまで気がしたですが。。。)
まだ、数式とコードとの関係がぼやけている状況です。
しぐまがふぉーに脳内変換できるレベル