Edited at

機械学習の理論を理解しようと エクセルでニュートラルネットワークを作ってみた 〜画像認識 mnist 編〜

More than 1 year has passed since last update.


シリーズ目次


エクセルでニュートラルネットワークを作ってみた

はじめにソースコードをダウンロードします。

ソースはここにおいておきます。

$ git clone https://github.com/sasaco/excel_deeplearning.git


フォルダ構成

今回作成した エクセルファイル(mnist.xlsm) と 10種類のフォルダに分けた学習用のビットマップ画像(*.bmp)をたくさん用意しました

image.png


操作方法

モードは2つあります


  1. 学習をするモード

  2. 学習したニュートラルネットワークを試すモード

image.png


1. 学習をするモード の操作方法

上図 1 ~ 10 で指定したフォルダ内の 28 × 28 ピクセルの画像に対して学習を行います

学習 とは 下図の赤字の数値を更新することを意味しています。

image.png



  • 重みリセットボタン をクリックすると 初期化します。


  • 学習開始ボタン をクリックすると 上図 1 ~ 10 で指定したフォルダ内のすべての画像ファイルについて学習開始します


2. 学習したニュートラルネットワークを試すモード の操作方法

判定ボタン をクリックすると 判定したい画像ファイルを選択するウィンドウが表示されます

image.png

それまでに 学習したニュートラルネットワークによって 上図 1 ~ 10 から予測を示します。

image.png


ニュートラルネットワークのしくみ


このExcel で構築しているニュートラルネットワークの構成図

image.png


入力層

入力は 28×28ピクセルのビットマップの各ピクセルの青色の強度を入力層にします

値は 255 で除した 0~1 の値を入力値にしました。

image.png


中間層

中間層は 100ノード × 1層 にします

image.png


出力

出力層は 1 ~ 10 で それぞれの出力が 学習した 1 ~ 10 の可能性を示している

下図の場合、5番目が 0.88244 で最大となっているので、このニュートラルネットワークスは

入力に対して、5番目が一番可能性があると判断している

image.png


ニュートラルネットワークとは


  • 入力値 × 中間層の重み係数 = 中間層層の出力値

  • ∑ 出力層の入力値 × 出力層の重み係数 = 出力値

image.png

中間層の出力値 → 出力層の入力値 とするときに活性化関数を通します。

image.png

活性化関数はいろいろあるようですが、今回採用した関数は、下式のシグモノイドです

image.png

Excel では 赤い数値が 重み係数 です

image.png


重み係数の調整

Excelの赤い数値(重み係数)を調整して、数字が認識できるようにします。


出力値と正解値との差

下図は1番目の画像を読み込んだ時、ニュートラルネットワークが5番目が 0.88244で最も可能性が高いと判断している

ニュートラルネットワークが出した数値と正解値(0.99 か 0.01)との差を error とする

image.png


正解値を算出する重み係数は

ニュートラルネットワークが出した数値と正解値との差 が分かったら

正しい値を算定する重み係数は、上記を逆算すればよい

① × ② × ③ × ④ + ⓹

① ニュートラルネットワークが出した数値と正解値との差

② 活性化関数の逆数(微分)

③ 入力層

④ 学習率

⓹ もともとの重み係数

image.png


学習率とは 一回の更新で 100% 反映してしまうと学習が収斂しないので、少しづつ学習するための係数



重み係数の更新

出力値と正解値との差 から 新しい 重み係数が分かったら、重み係数を更新します。

Excel の場合 青い数値を赤い数値にコピーする行為です。

image.png

この一連の動作を繰り返して 画像認識できるニュートラルネットワークを育てます。


学習実行

学習を実行したら 200000回の学習で正解率 90% になりました

test11.gif

4日間かかりました。

これが正解率が上がっていく様子です。

image.png