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

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

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

誤差逆伝播学習法は、教師信号とネットワークの実際の出力との誤差情報と勾配降下法を用いてネットワークを学習させる代表的な機械学習手法です。

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

この記事での最終的なプログラムのイメージとしては、以下のように、自分で書いた手書き数字をネットワークに判別させるといった具合です。

【成果物イメージ】

手書き数字データセット

今回用いるデータセットは、「UCI Optical Recognition of Handwritten Digits」と呼ばれる、8×8の小さな手書き数字データセットです。

よく見る28×28のMNISTデータセットと違い、小規模なので扱いやすいのが特徴です。

(※本当はMNISTを使うと学習に時間がかかってしまうからという理由もあります...)

UCI Optical Recognition of Handwritten Digits

それでは上記URLから、「optdigits.tra」(訓練データ)と「optdigits.tes」(テストデータ)をダウンロードして「OptDigits」というディレクトリに入れておきましょう!

それでは、実際にコードを加筆・修正していきましょう!

修正点1:データセット読み込み

まずは、データセットが前回とは異なるので、関数を書き換えましょう。

Optical Recognition of Handwritten Digits(以下OptDigits)は、3823枚の訓練画像、1797枚のテストデータからなります。

今回は訓練データ全てを使って学習させ、最後にテストデータ全てを使ってテスト精度を計測する形を取ろうかと思います。

また、学習が進むごとに訓練データを使って訓練精度を計測して学習進行具合も可視化してみましょう。

前回の「Irisデータセット」を読み込む関数と大きく違う部分は、2種類のデータセットを扱うことぐらいでしょうか。

また、OptDigitsは8×8で[0,16]の画素値が特徴パターンとなりますが、数値に差がないようにするために更に[0,1.0]の実数値に正規化して用いることにします。

以上の正規化は、ラムダ式を利用してコーディングしてみました。

(string型をfloat型に変更する必要もあるため)

【OptDigitsの特徴パターン】

実装

実装は以下のようになります。

修正点2:自分で書いた手書き数字をネットワークに流すための関数

次に、自分で書いた手書き数字をネットワークに流すために、単純な画像処理を施す必要があります。

今回は、「おえかきボード - ブラウザでかんたんお絵かき -」というサイトで200×200のキャンパスに以下のように数字を書いて、pngファイルで保存した画像を使うことにしましょう。

【おえかきボードで手書き数字を書く】

このような方法ですので、もちろん自分で書いた手書き数字は200×200のサイズでネットワークには流せません。

したがって画像をリサイズします。

また、一応カラー画像扱いなので、グレースケールにも変換します。

これらの処理は、Pillow(PIL)という画像処理ライブラリを使います。

(未インストールであれば、pip等でインストールしてください。 pip install pillow )

まずは、ライブラリのインポートを書き加えます。

実装

そして、以下の工程を実装します。

1、画像のグレースケール化
2、画像のリサイズ
3、ネガポジ(白黒)反転
4、ネットワークに流すためにList化

ネガポジ変換する理由は、OptDigits(背景: 黒 数字: 白)に合わせるためです。

実装は以下のようになります。

修正点3:部分修正

あとは少しだけコードを修正します。

まず、δを計算する calc_delta() で、教師ニューロンをIrisのときは3つでしたが、10クラス分に変更します。

次に、 test() は検証(訓練)精度を計測する関数になるので、名前を validate() に変更します。

そして新たに、テスト精度を計測する test() 関数を作成します。

内容は、ほとんど変わりません。

変更点は以上になります!

後編へつづく!

後編はこちら

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

書いた人はこんな人

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

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

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

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

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

関連記事

採用情報

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

バックエンドエンジニア

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

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

\ 世界を変える…! /

Androidエンジニア

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

iOSエンジニア