1. HOME
  2. ブログ
  3. IT技術
  4. 【後編】自作の誤差逆伝播学習法で手書き数字を認識させてみよう!【機械学習】

【後編】自作の誤差逆伝播学習法で手書き数字を認識させてみよう!【機械学習】

後編〜手書き数字を認識するプログラムを作る~

今回は、機械学習の要「誤差逆伝播学習法」を解説・実装してみる【人工知能】の記事で作成したコードを元に手書き数字を認識するプログラムを作ってみるの後半です!

前編はこちら

実際に手書き数字を認識させてみよう!

それでは、実際に動かして実験してみましょう!

実験は、以下のような実験条件とコード(main関数)で行なっています。

それぞれ処理ごとにコメントを書いているので参考にしてください。

ちなみにディレクトリツリーは、以下のようになっています。

 

実験条件

初期学習率0.1
学習率減衰×0.5 / 10 epochs

コード

出力結果

なんと訓練精度が約97.7%で、自分の手書き数字はいくつか間違えてはいるものの、大体予測ができています!

間違えた数字を見てみると、「6」「5」と間違えたりと確かに形が似ている数字です。

また何度か実験してみるとわかりますが、「9」「4」も比較的間違えやすいです。

なぜ完璧に識別できなかったのか?

いくつか原因が考えられますが、ひとつあげられるとしたら過学習(または過適合: Overfitting)していることが考えられます。

過学習
訓練データの精度は良くなるものの、未知のデータに対して精度が得られない現象

今回はテスト精度、つまり学習に使っていない未知データを使った精度も計算しています。

そのテスト精度は、「約44.8%」と高い精度とは到底言えません...。

また、学習過程での訓練精度とテスト精度を見てみてもテスト精度はなかなか伸びません。

【図 30エポックまでの訓練精度とテスト精度】

過学習の対策

過学習の簡単な対策としては、

  1. 学習データを増やす
  2. 良い学習データを使う
  3. 正則化項を誤差関数に加える

などがよく挙げられます。

1. 2. の学習データについては、今回8×8の小さな手書き数字データセットを用いたので、文字が潰れかけていて、普段私たちが書くような数字とは少しかけ離れています。

したがって手書き数字データセットは28×28の比較的解像度が良くデータ数の多いMNISTデータセットがよく用いられます

3. の正則化項については、過学習に陥ると重みが大きな値に発散してしまう現象がよく見られます

【図 大きな値に分散した重みが見られる例】

この現象から、重みが大きな値に発散しないように学習を進める手法があります。

他にも、Dropoutなど過学習を抑制する手法はいくつかありますがここでは割愛します。

実験に時間がかかる上にコーディングが複雑に

これも今回の実験でわかりますが、ネットワークが大きくなるほど、膨大な計算時間がかかります。

また、先のDropoutや正則化項などの新たな手法を加えていくほどコーディングは複雑になってきます。

自分でコードを書くことは大切ですが、最適なコードをかかないと無駄な処理が積み重なって時間がかかってしまい、トータルで見て時間と労力の無駄になることも多々あります。

フレームワーク

そこで、機械学習にはたくさんのフレームワークが提供されています。

有名どころであれば、「Tensorflow」「Keras」などが挙げられます。

これらは、基本的にPythonで動作します。

それゆえに「機械学習といえばPython」と言われているのです。

なぜ、同じPythonなのに処理速度に大きな差が出るかというと、Pythonで動く機械学習フレームワークの処理自体はCやC++で書かれているからです。

さいごに

今回は、自作の機械学習プログラムを使って、少し実用的な実験をしてみました。

実装を通してわかるように、シンプルな機械学習であればゼロから構築することはさほど難しい話ではありません。

しかし、ネットワークを大きくしたり、新たな機能を加えていくと一筋縄ではいかなくなってきます。

ですので、ある程度機械学習のしくみを理解できたら、既存の優秀なフレームワークに移行して快適な機械学習ライフに切り替えてみましょう!

また別の記事で、フレームワークを使った機械学習についてお話しできればと思います。

前編はこちら

こちらの記事もオススメ!

コード全体

書いた人はこんな人

広告メディア事業部
広告メディア事業部
「好きを仕事にするエンジニア集団」の(株)ライトコードです!

ライトコードは、福岡、東京、大阪の3拠点で事業展開するIT企業です。
現在は、国内を代表する大手IT企業を取引先にもち、ITシステムの受託事業が中心。
いずれも直取引で、月間PV数1億を超えるWebサービスのシステム開発・運営、インフラの構築・運用に携わっています。

システム開発依頼・お見積もり大歓迎!

また、現在「WEBエンジニア」「モバイルエンジニア」「営業」「WEBデザイナー」「WEBディレクター」を積極採用中です!
インターンや新卒採用も行っております。

以下よりご応募をお待ちしております!
https://rightcode.co.jp/recruit

関連記事

採用情報

\ あの有名サービスに参画!? /

バックエンドエンジニア

\ クリエイティブの最前線 /

フロントエンドエンジニア

\ 世界を変える…! /

Androidエンジニア

\ みんなが使うアプリを創る /

iOSエンジニア