
こんにちは、AI研究所の見習い研究員マサミです。
前回の記事「[簡単に分かる] プログラミング言語「Python」を使ったニューラルネットワークの作り方」では、ニューラルネットワークの順伝播方向の実行プログラムについて書きましたが、今回は「Chainer」を使った機械学習の方法について書きたいと思います。
機械学習に使用するデータはChainerのサンプルデータセットの中の「MINST」を使用します。
「MINST」の中には28px×28pxの手書きの数字画像(0〜9まで)を数値化したデータが70,000個入っています。
今回は、学習用のデータとして60,000個、テスト用のデータとして10,000個使用します。
作成するニューラルネットワークは以下です。
まずは、使用するライブラリ「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%」となりました。
少ないエポック数でも高い精度を出すことができました!