AI研究所 - AI(人工知能)に脅かされないために、AI(人工知能)を作る側の人間になる -

HOME  >  機械学習用ライブラリ「Chainer」を使ったディープラーニング

公開日:2017.09.18 [最終更新日]2017.10.23

機械学習用ライブラリ「Chainer」を使ったディープラーニング

カテゴリー: AI(人工知能)の作り方

こんにちは、AI研究所の見習い研究員マサミです。

前回の記事「[簡単に分かる] プログラミング言語「Python」を使ったニューラルネットワークの作り方」では、ニューラルネットワークの順伝播方向の実行プログラムについて書きましたが、今回は「Chainer」を使った機械学習の方法について書きたいと思います。

機械学習に使用するデータはChainerのサンプルデータセットの中の「MINST」を使用します。
「MINST」の中には28px×28pxの手書きの数字画像(0〜9まで)を数値化したデータが70,000個入っています。

img1

今回は、学習用のデータとして60,000個、テスト用のデータとして10,000個使用します。

作成するニューラルネットワークは以下です。

111

まずは、使用するライブラリ「Numpy」と「Chainer」をインポートします。

# Numpy
import numpy as np
# Chainer
import chainer
import chainer.links as L
import chainer.functions as F
from chainer import Chain, optimizers, Variable

次に学習に使用するデータを準備します。
今回はChainerのサンプルデータセットから「MNIST」をダウンロードしてきます。

train, test = chainer.datasets.get_mnist()

x_train = []
x_test = []
t_train = []
t_test = []

for line in train:
    x_train.append(line[0])
    t_train.append(int(line[-1]))

for line in test:
    x_test.append(line[0])
    t_test.append(int(line[-1]))

x_train = np.array(x_train, dtype=np.float32)
x_test = np.array(x_test, dtype=np.float32)
t_train = np.array(t_train, dtype=np.int32)
t_test = np.array(t_test, dtype=np.int32)

ディープニューラルネットワークのクラスを作成します。
ここでは、各層のノード数と活性化関数を設定します。

# DNNのクラス
class DNN(Chain):
    def __init__(self):
        super(DNN, self).__init__(
            l1 = L.Linear(784, 100),
            l2 = L.Linear(100, 100),
            l3 = L.Linear(100, 10)
        )
    def forward(self, x):
        h1 = F.relu(self.l1(x))
        h2 = F.relu(self.l2(h1))
        h3 = self.l3(h2)
        return h3

# DNNクラスのインスタンス
model = DNN()

学習の最適化手法、エポック数、バッチサイズを設定します。

# 最適化手法
optimizer = optimizers.Adam()
optimizer.setup(model)

# エポック数
n_epoch = 10

# バッチサイズ
batch_size = 1000

学習を実行するプログラムを作成します。
今回はミニバッチ学習で学習させます。

# 学習実行
for epoch in range(n_epoch):
    sum_loss = 0
    perm = np.random.permutation(60000)
    for i in range(0, 60000, batch_size):
        x = Variable(x_train[perm[i:i+batch_size]])
        t = Variable(t_train[perm[i:i+batch_size]])
        y = model.forward(x)
        model.cleargrads()
        loss = F.softmax_cross_entropy(y, t)
        loss.backward()
        optimizer.update()
        sum_loss += loss.data*batch_size

    print("epoch: {}, mean loss: {}".format(epoch, sum_loss/60000))

テストデータを使用してテストします。

# テスト実行
cnt = 0
for i in range(10000):
    x = Variable(np.array([x_test[i]], dtype=np.float32))
    t = t_test[i]
    y = model.forward(x)
    y = np.argmax(y.data[0])
    if t == y:
        cnt += 1

# 正解数と正解率を表示
print(cnt)
print("accuracy: {}".format(cnt/(10000)))

ここまでプログラムが書けたら実行してみます。
最初は、「MNIST」データのダウンロードがあるため少し時間がかかります。

実行した結果は「正解数:9,666」、「正解率:96.66%」となりました。
少ないエポック数でも高い精度を出すことができました!

タグ:


参考になったら「いいね!」と「シェア」をお願いします!!

このエントリーをはてなブックマークに追加
AI(人工知能)入門セミナー開催中
AI(人工知能)入門セミナー

AI入門ブログの中の人

AI研究所 研究スタッフ
通称:マサミ
アメリカ・サンフランシスコにある情報メディアの専門学校を卒業。大手金融会社での事務経験を経て、2016年9月よりAI研究所に入所。見習い研究員として、AI技術を日々勉強中。

LINE@

Facebookページ