こんにちは!
現役パラレルワーカー フクコです。
前回の記事↓に続き
来年の2月の試験に向けてE資格試験勉強中のため
ゼロつくシリーズでおなじみ
オーライリーから出版されている
ディープラーニングの本格的な入門書でよくおススメされる
「ゼロからつくる Deep Learning」本
この本↑を毎日5ページずつコツコツこなすと
約2か月間で今年中に終了するので
来年のE資格試験までにこれで基礎力をつけることにしました。(^^)
ついつい私は何もないとだらけてしまうので(笑)
毎日5ページ終わった後の記録とまとめを書いていこうと思います。
と、まとめに入る前に…
やる気を出すためのコトバをシェアします!!(主に私のやる気を出すために 笑)
「努力はどれだけしても足りないんだよ。
知ってるだろう、それは お前も。」
by 錆兎(さびと)
おなじみ私の大好きな「鬼滅の刃」から
錆兎(さびと)の名言です。
炭治郎の兄弟子にあたり、
右頬に大きな傷跡が描かれた狐面をつけた、宍色の髪の印象的な少年ですが
発言が男の中の男です。もう大好きです!!
実は…
私はもともと「鬼滅の刃」はあまりというかまーったく興味がなかったんですが
(アマノジャクなので、大人気マンガは基本的に読まないのです 笑)
たまたまテレビでちょうど錆兎(さびと)の出てくる3話目をやっていて、
セリフに完全に引き込まれてしまいました。(笑)
「鈍い 弱い 未熟 そんなものは男ではない。」
「進め!!男なら!
男に生まれたなら、進む以外の道などない!!」
私は男ではありませんが(笑)、錆兎(さびと)のコトバでめっちゃやる気が出たのを今でもよ~く覚えています。笑
そう!努力はどれだけしても足りないと常に思ってるぐらいがちょうどいいんですよね。
とにかく常に努力するのみ!! そしてふと気がついたら高みにいる!みたいな
錆兎(さびと)、どうもありがとう! (^0^)
今日もやる気が出てきました!
よし!! 今日も頑張るぞ~! お~!!
というコトで、錆兎(さびと)に見捨てられないためにも、今日も私はノルマをこなしますよ! 笑
ではでは、いい加減まとめに入ります。笑
その前に本の目次の紹介です。
ゼロつくディープラーニングは、下記↓の合計8章で構成されています。
本の目次
- 1章 Python入門
- 2章 パーセプトロン
- 3章 ニューラルネットワーク
- 4章 ニューラルネットワークの学習
- 5章 誤差伝播法
- 6章 学習に関するテクニック
- 7章 畳み込みニューラルネットワーク
- 8章 ディープラーニング
ちなみに…
ゼロつくディープラーニングの第1章はPython入門のセクション(20ページ分)なので、
とりあえず今回私は飛ばし、第2章からまとめています。
今回も第4章のつづきからですが、あともう少しで終わります。(>ー<)
第4章 ニューラルネットワークの学習つづき
ニューラルネットワークの学習とは、
訓練データから最適な重みパラメータの値を自動で獲得するようにできるコト。
4.5.3 テストデータで評価
ニューラルネットワークの学習では、
訓練データ以外のデータを正しく認識しているか確認する必要がある。
「過学習」を起こしていないか確認する。
1エポック(epoch)ごとに、訓練データとテストデータの認識精度を記録する。
1エポック(epoch) = 1エポックとは学習において訓練データを全て使い切ったときの回数に対応する。
正しい評価が出来るように、
前にPythonで実装したものをちょっと修正↓する。
# coding: utf-8 import sys, os sys.path.append(os.pardir) # 親ディレクトリのファイルをインポートするための設定 import numpy as np import matplotlib.pyplot as plt from dataset.mnist import load_mnist from two_layer_net import TwoLayerNet # データの読み込み (x_train, t_train), (x_test, t_test) = load_mnist(normalize=True, one_hot_label=True) network = TwoLayerNet(input_size=784, hidden_size=50, output_size=10) iters_num = 10000 # 繰り返しの回数を適宜設定する train_size = x_train.shape[0] batch_size = 100 learning_rate = 0.1 train_loss_list = [] train_acc_list = [] test_acc_list = [] #1エポック当たりの繰り返し数 iter_per_epoch = max(train_size / batch_size, 1) for i in range(iters_num): batch_mask = np.random.choice(train_size, batch_size) x_batch = x_train[batch_mask] t_batch = t_train[batch_mask] # 勾配の計算 #grad = network.numerical_gradient(x_batch, t_batch) grad = network.gradient(x_batch, t_batch) # パラメータの更新 for key in ('W1', 'b1', 'W2', 'b2'): network.params[key] -= learning_rate * grad[key] loss = network.loss(x_batch, t_batch) train_loss_list.append(loss) #1エポックごとに認識精度を計算 if i % iter_per_epoch == 0: train_acc = network.accuracy(x_train, t_train) test_acc = network.accuracy(x_test, t_test) train_acc_list.append(train_acc) test_acc_list.append(test_acc) print("train acc, test acc | " + str(train_acc) + ", " + str(test_acc)) # グラフの描画 markers = {'train': 'o', 'test': 's'} x = np.arange(len(train_acc_list)) plt.plot(x, train_acc_list, label='train acc') plt.plot(x, test_acc_list, label='test acc', linestyle='--') plt.xlabel("epochs") plt.ylabel("accuracy") plt.ylim(0, 1.0) plt.legend(loc='lower right') plt.show()
↑のPythonを実装して出た認識精度の図がコレ↓。
エポックがすすむにつれて(学習がすすむにつれて)
訓練データとテストデータを使って評価した認識精度は両方とも向上していることがわかる。
4.6 まとめ
第4章では、
ニューラルネットワークの学習について説明。
第4章のまとめは以下のとおり。
- 訓練データで学習を行い、学習したモデルの汎化能力をテストデータで評価する。
- ニューラルネットワークの学習は、損失関数を指標として、損失関数の値が小さくなるように重みパラメータを更新する。
- 重みパラメータを更新する際には、重みパラメータの勾配を利用して勾配方向に重みの値を更新する作業を繰り返す。
- 数値微分によって、重みパラメータの勾配を求めることができる。