フルスタックエンジニアを目指す|株式会社ナンバーワンソリューションズ

フルスタックエンジニアを目指す

AI Python

手書き文字認証を作ってみよう!~第1弾~

更新日:

実行環境

・Python3.6.1
・JetBrains PyCharm Community Edition
・Windows10

学習データおよびテストデータについて

学習データおよびテストデータとして手書き文字を何万データ分作るのは大変なので今回はMNISTという手書き数字のデータベースを用いてやります。
以下のサイトよりデータを入手できます
学習データ
テストデータ

※このデータは学習データで60000件、テストデータで10000件のデータセットになっている。いかに今回のソースを示すがもしソースコードを修正し自分なりに
アレンジを加えたいと思う方がいればより小さいデータセットが以下になる
学習データ(100件)
テストデータ(10件)

ニューラルネットワークの初期化

詳しい概念はページの下に参考書籍を載せておいたのでそちらを参考に!まず最初にニューラルネットワークで使う値の設定を行う。
ニューラルネットワークで重要になってくるのは入力層、隠れ層、出力層のノード数、リンクの重み付、学習率の設定を行う必要がある。
また活性化関数としてシグモイド関数(sig(a)=1/(1+exp(−a)))を用いる。シグモイド関数の公式を書いているがこれを多言語でやるとなかなか大変そうに感じるが、
Pythonは数学関係のライブラリーが多数存在し、シグモイド関数も一行で示すことができる。

以下初期化のメソッドである

ニューラルネットワークへの照会

ブログの概念を書くのには限界があるためよりくわしい概念を知りたい方はページの下に参考書籍を載せているので参考に!
このメソッドではニューラルネットワークへの入力を受け取り、そのネットワークへの出力を返す役割を果たすメソッドです。出力を行うためには
初期化で設定した内容を用いて計算する必要があります。入力層から隠れ層へ、隠れ層から出力層へ信号を送っていきます。

隠れ層へはまずニューラルネットワークへの入力に対し、隠れ層の重みを掛け合わせます。
式ではX(hidden) = W(input_hidden) ・ I
となります。以下で求めた値を出力層へ送るために活性化関数を用います。
式では O(hidden) = sigmoid(X(hidden)) となる。
同じ流れで隠れ層から出力層も行い出力された値がニューラルネットワークからの出力となる

以下メソッドの全貌である

ニューラルネットワークの学習

出力結果が実際の結果と違ったとき、重みを調整する必要性がある。それを繰り返しすることによりニューラルネットワークの精度を上げていく必要がある。
誤差を計算し最適な値を求めていく必要があるがそれが以下となる

早速やってみよう

入力層のノード数を784、隠れ層を200、出力層を10とする。隠れ層のノードは調整する必要があるが残りについてはまず、
入力層:784についてはMNISTのテストデータのピクセル配列が28×28=784であるところからきている。出力層:10は今回の手書き数字は0~9の
一桁を対象に行うもので0~9の計10数を対象にしていることからきている。

いかに学習からテストまでの内容を書いている

今回のまとめ

以上でテストしてみると正答率が約96%という結果が出た。今回はscikit-learnやtensorflowといったライブラリーを使わずにやったが高い正答率がでるものが
完成できた。
以下もっと詳しい概念を知りたい人がいれば以下の本をお勧めします

〇マイナビ出版 ニューラルネットワーク自作入門 Tariq Rashid[著]親納浩幸[監訳]

-AI, Python

Copyright© フルスタックエンジニアを目指す , 2019 All Rights Reserved Powered by STINGER.