Qstairs

現役AIベンチャーCTOの知見、画像認識(人工知能、Deep Learning)を中心とした技術ノウハウをアップしていきます

広告

【Deep Learning】Chainerを使ったニューラルネットワークを再勉強

f:id:qstairs:20160601221351j:plain

はじめに

これから私が事業を考えていくうえで欠かせない技術が
Deep Learningをはじめとした機械学習です。

これまでは画像認識の分野でCNNを用いた画像の識別を勉強してきましたが、
CNNではなくRNNのほうが、私が考えている事業で利用することになります。

そこで、RNNを理解するにあたって、
Deep Learningを改めて勉強していこうという考えに至っています。

#フレームワークとしてChainerを使用しています。
qstairs.hatenablog.com

処理

今回はscikit-learnを使ってIris(アヤメ)データをダウンロードし、
ニューラルネットワークを構築して学習・評価します。

Iris(アヤメ)データは、
花びらの長さ、幅、がく片の長さ、幅の4次元データに対して、
アヤメの種類であるsetosa(0),versicolor(1),virginica(2)の3種類が割り当てられています。
データは全部で150個あり、
今回は学習に半分、評価に半分使用しています。

#!/usr/bin/env python
# -*- coding: utf-8 -*-
from chainer import cuda, Function, FunctionSet, gradient_check, Variable, optimizers, serializers
from chainer.training import extensions
import chainer.functions as F
import chainer.links as L

from sklearn import datasets
import numpy as np

import os

class IrisChain():
    cuda.get_device(0).use()
    def __init__(self):
        self.model = FunctionSet(
            l1 = L.Linear(4,6),
            l2 = L.Linear(6,3),
        ).to_gpu()
    def __call__(self, x, y, train=True):
        h1 = F.sigmoid(self.model.l1(x))
        h2 = self.model.l2(h1)

        if train == True:
            return F.mean_squared_error(h2, y)
        else:
            return h2

cuda.get_device(0).use()

# iris=[花びらの長さ、幅、がく片の長さ、幅]→[setosa(0),versicolor(1),virginica(2)]
# データ数:150個
iris = datasets.load_iris()
X = iris.data.astype(np.float32)
Y = iris.target
N = Y.size
Y2 = np.zeros(3 * N).reshape(N, 3).astype(np.float32)
for i in range(N):
    Y2[i, Y[i]] = 1.0

index = np.arange(N)
# 奇数番目のデータを学習データにする
xtrain = X[index[index % 2 != 0],:]
ytrain = Y2[index[index % 2 != 0],:]
# 偶数番目のデータを学習データにする
xtest = X[index[index % 2 == 0],:]
yans = Y[index[index % 2 == 0]]

print N

model = IrisChain()
optimizer = optimizers.SGD()
optimizer.setup(model.model)

f = open("loss.csv","w")
for i in range(50000):
    x = Variable(cuda.to_gpu(xtrain))
    y = Variable(cuda.to_gpu(ytrain))
    model.model.zerograds()
    loss = model(x,y)
    loss.backward()
    optimizer.update()
    print "%d: %f"%(i, loss.data)
    f.write("%d,%f\n"%(i, loss.data))
f.close()

xt = Variable(cuda.to_gpu(xtest), volatile='on')
yt = yans
result = model(xt, yt, train=False)
nrow, ncol = result.data.shape
print nrow
correct = 0
for j in range(nrow):
    c = np.argmax(result.data[j,:])
    if c == yans[j]:
        correct += 1

print "%d / %d = %f"%(correct, nrow, float(correct)/float(nrow))

結果

繰り返し学習回数を50,000回で学習し、
そのときの損失の傾向をグラフにしました。
0.019あたりで収束しているようです。


また、正解率は、96%となっています。

72 / 75 = 0.960000

最後に

基本のキホン的な感じでニューラルネットワークを構築し、
実際に学習して評価しました。
これから、さらに複雑な処理を勉強していきます。



こちらの書籍を参考にしています。
www.amazon.co.jp


Deep Learningに関する過去の記事

qstairs.hatenablog.com
qstairs.hatenablog.com

広告