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() 関数を作成します。

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

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

後編はこちらに続きます。

ライトコードよりお知らせ

にゃんこ師匠にゃんこ師匠
システム開発のご相談やご依頼はこちら
ミツオカミツオカ
ライトコードの採用募集はこちら
にゃんこ師匠にゃんこ師匠
社長と一杯飲みながらお話してみたい方はこちら
ミツオカミツオカ
フリーランスエンジニア様の募集はこちら
にゃんこ師匠にゃんこ師匠
その他、お問い合わせはこちら
ミツオカミツオカ
   
お気軽にお問い合わせください!せっかくなので、別の記事もぜひ読んでいって下さいね!

一緒に働いてくれる仲間を募集しております!

ライトコードでは、仲間を募集しております!

当社のモットーは「好きなことを仕事にするエンジニア集団」「エンジニアによるエンジニアのための会社」。エンジニアであるあなたの「やってみたいこと」を全力で応援する会社です。

また、ライトコードは現在、急成長中!だからこそ、あなたにお任せしたいやりがいのあるお仕事は沢山あります。「コアメンバー」として活躍してくれる、あなたからのご応募をお待ちしております!

なお、ご応募の前に、「話しだけ聞いてみたい」「社内の雰囲気を知りたい」という方はこちらをご覧ください。

ライトコードでは一緒に働いていただける方を募集しております!

採用情報はこちら

関連記事