Irisデータセットを学習させてみよう|Irisデータセット分類問題

本ページではこれまでに実装したコードを使ってIrisデータセットでの学習を行なっていきます。
このページで行った学習の結果をもとに次回以降でIris分類問題を行います。

まだレイヤやクラス等の実装ができていない方はメインページの「ニューラルネットワーク作成編」をもとにニューラルネットワークを構築してから本ページに臨んで下さい。

 

事前準備

学習を始める前にまずはニューラルネットワークの学習教材となる「Irisデータセット」をブック内に用意しておく必要があります。

Irisデータセットの前処理【標準化とデータ分割】」をもとに「train-iris」と「test-iris」という2つのシートを作成していない場合はここで作成しておきましょう。

メインページの内容を順に行っている場合、この段階では「Deep_Learnig_iris.xlsm」というブック内に「Sheet1」「train-iris」「test-iris」「iris_dataset_standardization」「iris_dataset」の5種対のシートが存在しているはずです。

5種類のシ-トの存在が確認出来たら、その内の「Sheet1」と「iris_dataset」のシート名とオブジェクト名をそれぞれ下記のように変更してください。

Sheet1(シート名)       → Classification_iris
Sheet1(オブジェクト名)    → ws_Classification_iris
iris_dataset(オブジェクト名) → ws_iris_dataset

最終的には以下のような構成になっていればOKです。
ここで、標準モジュールやクラスモジュールの構成も併せて確認しておきましょう。
(オブジェクト名が「Sheet.X」のものはどんなオブジェクト名でも問題ありません)

以上で事前準備は完了です。

※VBE上にイミディエイトウィンドウが表示されていない場合は、[表示]>[イミディエイトウィンドウ](ショートカット[Ctrl]+[G])から表示状態にしておいて下さい。学習時に必要になります。

 

ハイパーパラメータ設定

学習設定としてハイパーパラメータを変更します。
(標準モジュール[Main]のコード内でハイパーパラメータの数値を変更するということ)

変更可能なハイパーパラメータは以下のとおりです。

hidden_size:隠れ層のニューロン数
MinLoss:最少Loss値(Loss値がこの値になったら学習を終了する)
MaxEpoc:最大エポック数(batch_size×MaxEpoc個のデータを学習したら学習を終了する)
train_size:学習用データのデータ数
test_size:テスト用データのデータ数
LearningRate:学習率(この値が小さいほど学習時間は長くなるが精度の高い学習ができる)
batch_size:バッチサイズ(まとめて何個のデータを学習するかを決める)
act_func:隠れ層の活性化関数(ReLU関数とSigmoid関数の切り替えが可能)

Iris分類問題は比較的簡単な問題のため、デフォルトのままでもうまく分類することができます。
学習のイメージがつかめてきたらいろいろ値を変えて実験してみて下さい。

 

Irisデータセットの学習

ハイパーパラメータの設定が完了したらあとはメインモジュールの「Sun train」を実行するだけで学習を始めることができます。通常のマクロのようにユーザーフォームやコマンドボタンから実行するわけではなく、VBE上で実行することを前提としているので注意してください。
 

学習精度の確認

学習を開始すると、イミディエイトウィンドウに以下のように学習精度が表示されていきます。

これはIrisデータをbatch_size回(デフォルト:100)学習する毎の学習精度を表します。
つまり初めの1行目は100(batch_size)個のIrisデータをもとに学習したニューラルネットワークの精度を表し、2行目はさらに100個のIrisデータを追加して学習した精度を表しています。この1行(100回の学習)のことを「1エポック」といいます。(実際の意味は少し違いますが)

Irisデータセットの学習用データはデフォルトで120個としているので、ほぼすべてのデータを学習していることになります。本来は数千、数万ぐらいのデータで行うため、この1エポックごとの学習を繰り返し、徐々にすべての学習データを考慮した学習が行われていきます。

イミディエイトウィンドウに出力される精度は左から順に
[エポック回数][Loss値][学習用データでの正解率][テスト用データでの正解率]となっています。

エポック回数:batch_size回の学習をまとめて1エポックとした時の現在のエポック数を表す
Loss値:値が0に近づくほど適切なパラメータに近づくことを表す
学習用データでの正解率:学習用データでの現在のニューラルネットワークの正解率を表す
テスト用データでの正解率:テスト用データでの現在のニューラルネットワークの正解率を表す

一応基本の流れということで学習用データでの正解率と、テスト用データでの正解率を表示させていますが、Irisデータセットはデータ数が少ないためはあまり意味をなさないものです。
(詳しくは「MNIST学習で文字認識」で解説しています)

テスト用データでの正解率は「ニューラルネットワークの精度」とも言い換えることができるので、ここではテスト用データでの正解率さえ確認しておけば問題ありません。
 

学習の終了

学習は終了条件によりますが、ハイパーパラメータがデフォルトの場合10秒もかからず終わります。

学習が終わると「Parameters」というシートが作成され、学習結果である重みパラメータとバイアスパラメータの値がシートに書き出されます。(すでにシートが存在している場合は上書きされます)

学習が1度完了すれば、あとは何回でも推論(Irisの分類を調べること)が可能になります。
推論をする際は、ここで出力した「Parameters」シートの値を使用するので、学習が終わったらこのシートは残したまま次のステップへと進んでください。

 

まとめ

今回はこれまでに実装したモジュールを使いIrisデータセットの学習を行いました。
学習の手順を簡単にまとめると以下のとおりです。

① Irisデータセットの取り込み(要前処理)
② ハイパーパラメータの設定
③ [Main]モジュールの[Sub train]をVBE上で実行
④ ニューラルネットワークが学習待ち(数秒)
⑤「Parameters」シートに学習結果が出力される

これまでにいろいろやってきましたが、一番欲しかったのは「Parameters」シートに出力された学習結果(「Affineレイヤ」の重みパラメータとバイアスパラメータ)です。

あとはこの学習済みのパラメータをニューラルネットワークに取り込むことで、入力されたデータに対するIrisの種類を推論させることができます。

次回は実際にニューラルネットワークに推論をさせるためのコードを実装していきます。

【次回】入力された値からIrisの種類を分類してみよう
【前回】メインモジュールの実装 
メインページ

 

 icon-book 参考書籍

 

2021年6月13日AI, Deep Learning, Excel, VBA

Posted by Lic