入力された値からIrisの種類を分類してみよう|Irisデータセット分類問題
本ページではこれまでに実装したすべてのコードを使ってIrisの運類問題をさせていきます。任意の4つの数字をニューラルネットワークに読み込ませ、花の種類を認識させることがExcel VBAにもできるのかを実際に体験してみましょう。
今回の内容は既にIrisデータセットが学習されていることが前提です。
まだの方はメインページの「ニューラルネットワーク作成編」を参考にニューラルネットワークの学習を行っておいてください。
メインモジュールの実装(追加)
学習時にも使っていた「Main」モジュールに推論用のコードを追加します。
(※新規のモジュールではないので注意)
以前作成した関数「Train」の下に関数「Classification_iris」を追記します。
以下は関数「Classification_iris」の全コードです。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 |
'Call network.ExportParameters(ParamsSheet) 'MsgBox "学習終了" & vbLf & "学習結果はシート(Parameters)に書き出しました。" 'End Sub '------------------------------------------------------------------------------- Sub Classification_iris() Dim Data() As Double ReDim Data(input_size) '******************************************************* ' irisデータセット正規化(平均:0 / 分散:1) '******************************************************* Dim DataCount As Long 'データ総数 Dim DataSum As Double 'データ合計値 Dim DataAve As Double 'データ平均値 Dim DataDev As Double 'データ偏差値 Dim DataDevSum As Double 'データ偏差の2乗合計値 Dim DataDevSta As Double 'データ標準偏差 Dim EndRow As Long Dim EndCol As Long Dim r As Integer Dim c As Integer With ws_iris_dataset EndRow = .Cells(rows.count, 1).End(xlUp).Row EndCol = .Cells(1, Columns.count).End(xlToLeft).Column 'データの合計数 DataCount = (EndRow - 1) * (EndCol - 1) 'データの合計値 For r = 2 To EndRow For c = 1 To (EndCol - 1) DataSum = DataSum + .Cells(r, c).Value Next c Next r 'データの平均値 DataAve = DataSum / DataCount 'データの偏差2乗の合計値 For r = 2 To EndRow For c = 1 To (EndCol - 1) DataDev = .Cells(r, c).Value - DataAve DataDevSum = DataDevSum + (DataDev ^ 2) Next c Next r 'データの標準偏差 DataDevSta = Sqr(DataDevSum / DataCount) For c = 1 To 4 DataDev = ws_Classification_iris.Cells(2, c).Value - DataAve Data(c) = DataDev / DataDevSta Next c End With Dim ModelSheet As Worksheet Set ModelSheet = Worksheets.Item("Parameters") Dim network As TwoLayerNet Set network = New TwoLayerNet Classification_mode = True Call network.Initialize(input_size, hidden_size, output_size, ModelSheet) Dim answer As Long answer = network.answer(Data) Dim answer_species As String If answer = 1 Then: answer_species = "setosa" If answer = 2 Then: answer_species = "versicolor" If answer = 3 Then: answer_species = "virginica" ws_Classification_iris.Cells(2, 5).Value = answer_species End Sub |
学習ではニューラルネットワーク内で順伝播と逆伝播を繰り返していましたが、推論では順伝播を1回行うだけです。最終的にSoftmax関数によって導き出される値(順伝播の最終出力)のうち一番大きな値をもつラベルが推論結果となります。
ニューラルネットワークによる推論
ニューラルネットワークに推論させるためにまずは4つの入力値を入力するエリアを作成します。
ここでは単純にExcelのワークシート状の特定のエリアに入力されている値を入力値とします。
前回、名前の変えた「Classification_iris」シート内にした画像のようなエリアを作成します。
左から順に「ガクの長さ / ガクの幅 / 花弁の長さ / 花弁の幅 / 花の種類」です。
また、上記のコード「Classification_iris」を実行するためのコマンドボタンも作成します。
左の4つのエリアにはそれぞれの入力値を入力します。
その後「Classification」ボタンを押すと「species」に結果が出力されるといった流れになります。
※「Irisデータセットを学習させてみよう」でやったとおり、学習後は「Parameters」というシートが出力されます。推論する際には「Parameters」シートが必要なので予め学習させておきましょう。
初めは「test_iris」シートにあるデータのうち1つを抜き出して実行してみましょう。
入力した値に対して、出力された値(花の種類)が当たっていれば分類問題は成功です。
テスト用データをいくつか試してニューラルネットワークが正しいかを確かめてみてください。
おそらくほぼ100%の精度で答えが導き出されるはずです。
まとめ
今回はこれまでに実装したニューラルネットワークや関数を使って、ニューラルネットワークにIrisの識別をさせる方法を紹介しました。
ニューラルネットワークでの推論の方法をまとめると以下のとおりです。
① 4つの入力値を指定のエリア(A2:D2セル)に入力
② 学習済みシート「Parameters」を用意
③ Mainモジュールの「Sub Classification_iris」を実行
④ ニューラルネットワークに①の値を読み込ませる
⑤ 推論結果が指定のエリア(E2セル)に出力される
今回のIris分類問題はこれまでもちょこちょこいっていましたが、ニューラルネットワークを使うほど難しい問題ではありません。
そのため、学習結果を見てももあまり「すごい!」とならない人が多いと思います。
そういった方には、もう1レベル上ランクの「MNIST学習で文字認識」をお勧めします。
基本的には今回作成したニューラルネットワークの構造と同じですが、ニューロンの数や扱うデータ数が一気に増えます。学習時間も数時間はかかるかなり本格的なニューラルネットを構築していくので興味のある方は合わせて学習してみて下さい。
【前回】Irisデータセットを学習させてみよう
メインページ