【Chainerで画像識別4】結果はどうなる?MNISTによる画像認識の結果報告!

【Chainerで画像識別4】結果はどうなる?MNISTによる画像認識の結果報告!

 

ども!アイーンです。

今回は前回の続き

MNIST(エムニスト)を使って訓練したネットワークを

テストに使用してみます。

 

それでは行ってみましょう。

 

前回の続き

今回のコードは前回から引っ張ってきましょう。

はいボン!

import chainer
import chainer.links as L
import chainer.functions as F
from chainer import Variable,Chain,optimizers,serializers,datasets

import numpy as np
import matplotlib.pyplot as plt

from chainer.datasets import tuple_dataset
from chainer import training, iterators
from chainer.training import extensions


#データの読み込み
mnist_data = datasets.get_mnist(ndim=3)
train_data = mnist_data[0]
test_data = mnist_data[1]

class Gazou(Chain):
    def __init__(self):
        super(Gazou,self).__init__(
            cnn1 = L.Convolution2D(1,15,5),
            cnn2 = L.Convolution2D(15,40,5),
            l1 = L.Linear(640,400),
            l2 = L.Linear(400,10),
        )

    def __call__(self, x, t):
        return F.softmax_cross_entropy(self.predict(x), t)

    def predict(self,x):
        h1 = F.max_pooling_2d(F.relu(self.cnn1(x)), 2)
        h2 = F.max_pooling_2d(F.relu(self.cnn2(h1)), 2)
        h3 = F.dropout(F.relu(self.l1(h2)))
        return self.l2(h3)

model = Gazou()
opt = optimizers.Adam()
opt.setup(model)

iterator = iterators.SerialIterator(train_data,500)
updater = training.StandardUpdater(iterator, opt)
trainer = training.Trainer(updater,(20, "epoch"))
trainer.extend(extensions.ProgressBar())
trainer.run()

serializers.save_npz("tegaki.npz", model)

 

今回は簡単、最後の5行

iterator = iterators.SerialIterator(train_data,500)
updater = training.StandardUpdater(iterator, opt)
trainer = training.Trainer(updater,(20, “epoch”))
trainer.extend(extensions.ProgressBar())
trainer.run()

serializers.save_npz(“tegaki.npz”, model)

 

コイツを削除します。

 

そして、代わりにシリアライザーのloadを書きましょう。

serializers.load_npz("tegaki.npz", model)

 

思い出せない人は、ブログの過去記事に記載してありますので

そちらも必見です。

 

それでは、テストのコードを書いてみます。

テスト用のコードはどうする?

correct = 0
for i in range(len(test_data)):
    x = Variable(np.array([test_data[i][0]],dtype=np.float32))
    t = test_data[i][1]
    y = model.predict(x)

    index = np.argmax(y.data)
    if index == t:
        correct += 1

print("正解:", correct ," 全体:", len(test_data), " 正解率:", correct / len(test_data) * 100,"%")

最終行にこれを追加しましょう。

correct = 0

で、正解数を蓄積する変数を用意します。

for i in range(len(test_data)):

テストデータの量、ループを回して

xにはtest_data[i][0]に入っているテストデータを入れ

tにはtest_data[i][1]に入っている正解データを入れます。

yにはmodelのpredict関数を使って、予測値(ネットワークからの回答)を入れます。

 

そして

index = np.argmax(y.data)
if index == t:
  correct += 1

 

np.argmax(y.data)を使って

y.dataの中から最大値のインデックスを取り出し

indexに入れましょう。

 

Chainクラスのl2を見てみると

最終的な出力層のノード数は10個になっています。

 

これはもちろん

0~9までの数字10個を表します。

2を意味するノードのインデックスが最大値であり

それがtと同一なら

正解は2

 

簡単ですね。

 

それでは最後に結果を出力してみましょう。

さて訓練結果は?

ドキドキするね~。

今回の訓練には、データの多さも相まって

合計で約25分かかっております。

 

それだけの時間かかったのだから

それなりの結果を期待します。

 

さて!けっかはっぴょ~!!!

 

 

 

 

・・・質素

 

 

 

まとめ

華やかさに欠ける結果でしたが

正解: 9917  全体: 10000  正解率: 99.17 %

とかなりの高水準。

まぁ、逆に正解数5000くらいにする方が難しいんですかね。

 

これで貴方の肩書は「ドエムニスト」です。

いつか世界中のエムを使役するドミネーター的存在になります。

 

それでは。