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

こんにちは、AI研究所の三谷です。

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

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

img1

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

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

111

まずは、使用するライブラリ「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%」となりました。
少ないエポック数でも高い精度を出すことができました!

最新情報をチェックしよう!
企業向けAI人材育成サービス

企業向けAI人材育成サービス

AI事業発足やAI導入に必要な人材育成のステップとAI研究所が提供するサービス。AI研究所の人材育成サービスでは、3つのステップを軸に御社の業務内でAIを活用できる人材育成やAIプロジェクトの支援を行います。

CTR IMG