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

最新情報をチェックしよう!