【Chainer実践編3】加工データはどう学習に使う?学習させてみたらそりゃ理解できるだろうよ。

【Chainer実践編3】加工データはどう学習に使う?学習させてみたらそりゃ理解できるだろうよ。

入社してきた新入社員も、大体目が死に始める今日この頃

いかがお過ごしですか?アイーンです。

 

【Chainer実践編2】sckit-learnのデータはどう使うの?データセットの中身を加工してみたら理解できた。

今回は、前回作成した加工データを使用してニューラルネットワークに学習を行わせ、学習したNNを使って実際にアヤメの品種分類が出来るかを体験してみましょう。

前回の続きからコードを書いていきますので、見てない方は前回もぜひ試してみてください。閲覧回数が伸びて主が喜びます。

ニューラルネットワークを作ろう

class IrisLearn(Chain):
    def __init__(self):
        super(IrisLearn,self).__init__(
            l1 = L.Linear(4,6),
            l2 = L.Linear(6,6),
            l3 = L.Linear(6,3),
        )

    def predict(self,x):
        h1 = F.sigmoid(self.l1(x))
        h2 = F.sigmoid(self.l2(h1))
        h3 = self.l3(h2)
        return h3

ここはもう出来て当然って感じになれました!自分の進歩を数値化できれば、クエストログみたいで人生楽しめそうだなぁ。

Chainクラスの作成です。
これで4-6-6-3の4層で出来たニューラルネットワークを作ります。

 

次は、Optimizersの設定です。

 

ニューラルネットワークにOptimizersを設定しよう

model = IrisLearn()

opt = optimizers.Adam()

opt.setup(model)

今回もAdamをくっつけます。

Adam使っときゃ間違いないってなってますが、調べたところ他にもたくさんのOptimizerがあるみたいです。そのうち特集を組みます。

そのうち。

夢物語は置いといて、次で学習させてみましょう。

 

学習させてみよう

for i in range(10000):

model.cleargrads()
y_train_v = model.predict(x_train)

loss = F.mean_squared_error(y_train_v,t_train_v)
loss.backward()

opt.update()

 

今回はループを10000回回して学習させます。

.cleargrads()で勾配を初期化し

訓練データ(x_train)をmodelというNNに入力、結果を出力データ(y_train_v)に入れときます。

 

そしてlossに損失関数を使って出力と正解を比較して層質量を計算。

損失量の勾配を後ろへ伝播させます。

 

最後に損失量の勾配を使って重みとバイアスを更新

これの繰り返し。

 

これでOKです。

 

コイツを実行すれば、modelが持つ重みとバイアスがちょうど入力データをキレイに分けてくれるようになってるはず!・・・です。

 

それでは、学習が終わったmodelを使ってテストをしてみましょう。

 

はたして本当に分類できるのか!?

model.cleargrads()

y_test_v = model.predict(x_test_v)

y_test = y_test_v.data

訓練で入力されているmodel内の勾配を初期化し

学習が完了したmodelを使って、出力データをy_test_vに入れます。

最後はy_testに出力データを移しておきます。

 

correct = 0

count = y_test.shape[0]

for i in range(count):
    maxIndex = np.argmax(y_test[i, :])
    print(y_test[i, :], maxIndex)
    if maxIndex == t_test[i]:
        correct += 1

 

correctは正解数をカウントします。

countには、テストの数が入力されます。

あとはテストの回数ループさせて、ひとつづつ分類していきましょう。

maxIndexy_testに入っている出力データの最大値が入った列を各行に入力します。
0とか2とか。

y_testには、こんなデータが入ってます。

[-0.01382238  1.0174087  -0.00376201]

この場合は、真ん中の1列目が最大ですので、maxIndexにはと入ります。

そして、最大値の行t_testに入っている数値が一致した場合は、正解としてcorrectに1を足していきます。

最後は、詳細を出力して結果を確認しましょう。

print(“正解数 “, correct, “,問題数 “,count , “, “, correct/ count * 100,”%”)

 

さて結果は?

正解数  73 ,問題数  75 ,正解率  97.33333333333334 %

たっか!!!超正解してるじゃん!

ってか正解できなかった2個ってなんなのよ!

他の品種とめっちゃ数値が似てる品種だしてきてんだろ!

・・・これを細かく分類できるのが、完璧な人工知能になるんでしょうね。

今はこれがせいいっぱい(byルパン3世)

 

どうでしたか?出来ましたか?

これよりいい結果を出せる学習方法をぜひ教えていただきたい!

私も頑張ります。

でも、これで応用が利くようになったんではないでしょうか。

 

これで貴方の肩書は、「結構いい数値で学習させられる人」です。

実務に使うにはお互い経験を積みましょう。

 

それでは。