読者です 読者をやめる 読者になる 読者になる

アラカン"BOKU"のITな日常

人事評価と人工知能について考えたことがメインテーマです。

ディープラーニングによる手書き数値認識結果の内訳を分析する。

ディープラーニング

手作りのディープラーニング実装で実施した手書き数字認識テストの結果を分析してみた話を中心に書きます。

 

マクロ的に正解率何%だと言うだけではそこでとまってしまうので、不一致になったデータの傾向を調べてみたわけです。

 

前回の予告で、参考のために、学習用のデータ60000枚をそのまま使って、手書き数字認識テストもやってみると書いていたので、それを最初にやりました。

 

結果は、1%くらい改善して、98.32%になりました。

 

学習に使ったデータと同じデータなので、正解率が向上するのは当たり前です。ほぼ、予想通りです。

 

予想どおりすぎては、面白くはないので、この件はおしまいです。ちなみに内訳はこうです。

f:id:arakan_no_boku:20161112214403j:plain

 

さて、テスト用データの解析の方に戻ります。

 

正しく手書き数字を認識できた画像と、そうでない画像は、前回に調べた「9」の様に、人の目で見てもこれは間違うなと思うものはあります。

 

でも、さらに個別に調べていくと、パッと見た目では正しく認識できている画像と差がないように見えるのになあ・・というものも散見されます。

 

この違いを生んでいる原因はなんだろう?と考えて、もう少し踏み込んでみることにします。

 

例えば、この2つの画像です。

誤認識した0(9と間違えた)

f:id:arakan_no_boku:20161112220945j:plain

正しく認識した0

f:id:arakan_no_boku:20161112220959j:plain

 

人の目で見る限り、上の方が0らしく、下の方が上にちょこっとでている部分を見て、6とかに間違えても不思議はなさそうに見えるのですが、結果は逆なんですね。

 

内部で処理している数字データにしてみると違いがわかるかもしれないと考えて、pythonで28✕28の配列データに変換してみました。

誤認識した0(9と間違えた)

f:id:arakan_no_boku:20161112223600j:plain

正しく認識した0

f:id:arakan_no_boku:20161112223701j:plain

 

一見、画像で見たときと変わらず、上の方が人の感覚の0に近い様に見えます。

 

でも、こんな風に何枚も画像とテキストデータを見比べていると、ある法則性があることに気づきました。

 

それは、上のように、数字のかたまり具合が薄い場所と、厚い場所で差がある「0」の画像は誤認識の確率が高く、下のように数字のかたまり具合(厚み)が全体的に揃っている「0」の画像は、正しく認識される確率が高いみたいだということです。

 

いくつか仮説を考えたのですが、全結合ネットワークを、pythonで処理する際には、上の例みたいに28✕28ではなく、1✖784の行列データにして処理していることが影響しているのではないかというのが、今のところ、一番お気に入りの仮説です。

 

1✖784にすると計算がとてもシンプルにできるようになります。でも、28✕28で見るときのような位置情報(上下左右からの相対位置とか)は失われますからね。

 

数字のかたまり具合が1行分薄いだけでも、数字が0に置き換わったバイト数にすると大きい差になっていて、誤認識の原因になっているのではないか?という感じですね。