フォント数字を使って手書き数字を判別(2)
前回の続き
フォント数字を使って手書き数字を判別 - External Memory
75%や85%程度の正答率はあまり納得いかなかったので、
もう少しだけ、正答率を上げるためのことをした。
手書き数字を認識するために、実際の手書き数字を何万も集めるのは手間であり、
フォントデータ等のデータから学習するほうが手軽であると思われる。
前回からの改善点は学習するフォントをすべて手書き風のフォントにしたことである。
ネットからhandwrittenのフリーフォントを115種類集め、加工によりデータ数を100倍に増やして学習させ、MNIST数字データの分類を行った。
よって115000の手書き風数字データが得られたことになる。
結果は以下のとおりである。
最初の出力データのみフォント種類は58種類である(データ数58000)。
keep probはドロップアウトのkeep率、rは画像のアフィン変換時の変形率の幅である。
出力のうち正答率がMAXのもののみ抽出した。
FFNN units step train_loss train_acc test_loss test_acc ----------------------------------------------------------------------------------- keep_prob=0.7 r=0.4 Fontdata:58種類 784,784,784,10 21000 0.0880 0.9830 0.3662 0.9018 keep_prob=0.8 r=0.4 Fontdata:115種類 784,784,784,10 21000 0.1049 0.9732 0.3259 0.9140 keep_prob=0.8 r=0.4 Fontdata:115種類 784,784,392,10 24000 0.1168 0.9694 0.3122 0.9155 CNN step loss accurancy -------------------------------------- keep_prob=0.5 r=0.4 Fontdata:115種類 18000 0.2455 0.9363 keep_prob=0.3 r=0.4 Fontdata:115種類 16000 0.2118 0.9375
前回と比べてFFNNでは16%、CNNでは9%ほど正答率は向上した。
しかし例えば文字列を識別する際、
正答率99%は10文字識別する間に10%の確率でどれか間違う。
93%なら約50%の確率で間違う。90%なら65%の確率で間違う。
いくつか候補を提示したうえで決定するなら、それなりでもいいと思うが
正答率によって識別道具としての使いどころは限られる。
(追記8/30)
グレースケールでも試して、正答率はハイパーパラメータの再調整後FFNNは1%ほど向上した。
また、学習データの正答率とテストデータの正答率が反比例気味でありかつ過学習でもないのでまだ手書き風フォント数字データと一部のMNIST手書き数字データの間にはノイズとして処理できないほどの明確な相異なる特徴を有していると思われる。
テストデータを分類するための学習データがテストデータとは似通っていないなんてことはあってはならない。
また学習データのlossが比較的大きいので、ニューラルネットワークが学習データの多様な特徴などを十分に学習するキャパシティがないのかもしれない。
結局これらからネットワークモデルの能力不足と学習データの汎化がまだ甘いのが原因と考えられる。テストデータに対して、学習データをさらに絞ったうえで厳選しなければならないということか。
デジタルな数字と草書のような数字といった同じ数字同士ががお互いに相容れない特徴を持つこともある。、
汎化にはより多様な学習データからより多くの学習パラメータを適用するのがぱっと思いつく一つの方法だと思うが、別の方法としては、対象の特徴間の相対的関係を判別することである。
というのも人間の対象に対する認識の判別は様々な特徴間の相対的関係によるものだと思われるからである。
対象が画像内のどこの位置にあっても人間は判別可能であるし、大域的特徴も判別する。
CNNは似たようなことが出来ると思うが、前回と今回の結果ではあまりそうなっていなかった。CNNのハイパーパラメータ最適化はほとんどやっていないので、限度はあると思うがまだ考える余地はあるだろう。