2018年4月9日月曜日

Matlab for Java : (7) Neural Networkの利用

今回はMatlabを利用してJavaからNeural Networkを実施してみます。

(1) 利用データ
利用データは、ディープラーニングがわかる数学入門(技術評論社) を参考にして、手書き文字の「0」「1」を12個のデータで表したものを利用します。
csvから取り込みますが、最初の12列は画像データ(数値の0または1を0,1で表している)もので、13-14列目が数値の0または1を表しています(10が0、01が1)




これを取り込んで、target配列には最後の2列のみ入れておきます。

(2) Neural Networkの実行(初期設定)
まず隠れ層のサイズを決めます。
hiddenLayerSize = 3
net = patternnet(hiddenLayerSize)
https://jp.mathworks.com/help/nnet/ref/patternnet.html
(3) 学習
データを学習、検証、テストの各サブセットに分割します。
https://jp.mathworks.com/help/nnet/ug/divide-data-for-optimal-neural-network-training.html
net.divideParam.trainRatio = 70/100; //学習
net.divideParam.valRatio = 15/100; //検証
net.divideParam.testRatio = 15/100; //テスト
70% は学習に使用。
15% は、ネットワークが汎化されていることを検証し、過適合の発生前に学習を停止するために使用。
最後の 15% は、ネットワークの汎化の完全に独立したテストとして使用。
https://jp.mathworks.com/help/nnet/gs/classify-patterns-with-a-neural-network.html
学習します。
https://jp.mathworks.com/help/nnet/ref/train.html
[net,tr] = train(net,inputs,targets)
net : 新たに学習させたネットワーク
tr : 学習記録 (epoch および perf)

これを見ると
best_epoch: 19
best_perf: 2.4662e-07
図のように19回繰り返すことで一番良い値が得られていることがわかります。
https://jp.mathworks.com/help/nnet/ug/analyze-neural-network-performance-after-training.html

勾配も十分小さくなり、収束したことがわかります。validationからも特に過学習がないことがわかります。
(4) テスト
outputs = net(inputs)
混同行列を用いて、学習データとテスト結果から精度を表示します。
右上の赤はクラス2だったものがクラス1に分類された数
左下の赤はクラス1だったものがクラス2に分類された数
今回は全て正しく分けられている。
https://jp.mathworks.com/help/nnet/ref/plotconfusion.html

[c,cm] = confusion(targets,outputs)
c : 混同値 = 誤分類された標本の割合
cm : 2 行 2 列の混同行列
https://jp.mathworks.com/help/nnet/ref/confusion.html
fprintf('Percentage Correct Classification   : %f%%\\n', 100*(1-c));
fprintf('Percentage Incorrect Classification : %f%%\\n', 100*c);


plotroc(targets,outputs)
plotroc(targets,outputs) は、各出力クラスの受信者動作特性をプロットします。各曲線がプロットの左端および上端により多く沿っているほど、分類の精度が高いことを示します。
https://jp.mathworks.com/help/nnet/ref/plotroc.html
図では見えないほど、左端、上端にグラフがあるので精度は良いです。
最後にoutputsを出力しています。
ソースコード

0 件のコメント:

コメントを投稿