おひとりさま現役パラレルワーカーフクコろぐ

これからの会社員は、複数の収入源をもとう! 会社に翻弄されずアナタらしく仕事ができる。 そんなパラレルワーカーを広めるフクコのブログです。

【文系プログラミング初心者deE資格】ゼロつくディープラーニング #16

f:id:fukuko-parallel-work:20211115122059j:plain


こんにちは!

現役パラレルワーカー フクコです。

f:id:fukuko-parallel-work:20210212204833p:plain



前回の記事↓に続き

www.fukuko-parallel-work.com





来年の2月の試験に向けてE資格試験勉強中のため


ゼロつくシリーズでおなじみ

オーライリーから出版されている

ディープラーニングの本格的な入門書でよくおススメされる

「ゼロからつくる Deep Learning」本


f:id:fukuko-parallel-work:20211029220008j:plain




この本↑を毎日5ページずつコツコツこなす

約2か月間で今年中に終了するので

来年のE資格試験までにこれで基礎力をつけることにしました。(^^)


ついつい私は何もないとだらけてしまうので(笑)

毎日5ページ終わった後の記録とまとめを書いていこうと思います。


と、まとめに入る前に…

やる気を出すためのコトバをシェアします!!(主に私のやる気を出すために 笑)



「努力はどれだけしても足りないんだよ。

知ってるだろう、それは お前も。」

by 錆兎(さびと)



おなじみ私の大好きな鬼滅の刃から

錆兎(さびと)の名言です。


炭治郎の兄弟子にあたり、

右頬に大きな傷跡が描かれた狐面をつけた、宍色の髪の印象的な少年ですが

発言が男の中の男です。もう大好きです!!

実は…

私はもともと鬼滅の刃はあまりというかまーったく興味がなかったんですが
(アマノジャクなので、大人気マンガは基本的に読まないのです 笑)

たまたまテレビでちょうど錆兎(さびと)の出てくる3話目をやっていて、

セリフに完全に引き込まれてしまいました。(笑)


「鈍い 弱い 未熟 そんなものは男ではない。」

「進め!!男なら!
 男に生まれたなら、進む以外の道などない!!」


私は男ではありませんが(笑)、錆兎(さびと)のコトバでめっちゃやる気が出たのを今でもよ~く覚えています。笑


そう!努力はどれだけしても足りないと常に思ってるぐらいがちょうどいいんですよね。

とにかく常に努力するのみ!! そしてふと気がついたら高みにいる!みたいな


錆兎(さびと)、どうもありがとう! (^0^)

今日もやる気が出てきました! 

よし!! 今日も頑張るぞ~! お~!! 

というコトで、錆兎(さびと)に見捨てられないためにも、今日も私はノルマをこなしますよ! 笑


ではでは、いい加減まとめに入ります。笑



その前に本の目次の紹介です。

ゼロつくディープラーニングは、下記↓の合計8章で構成されています。

本の目次

  • 5章 誤差伝播法
  • 6章 学習に関するテクニック


ちなみに…

ゼロつくディープラーニング第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を実装して出た認識精度の図がコレ↓


f:id:fukuko-parallel-work:20211114185009j:plain



エポックがすすむにつれて(学習がすすむにつれて)

訓練データとテストデータを使って評価した認識精度は両方とも向上していることがわかる

4.6 まとめ


第4章では、

ニューラルネットワークの学習について説明。


第4章のまとめは以下のとおり。

  • 訓練データで学習を行い学習したモデルの汎化能力をテストデータで評価する。
  • ニューラルネットワークの学習は、損失関数を指標として、損失関数の値が小さくなるように重みパラメータを更新する。
  • 重みパラメータを更新する際には、重みパラメータの勾配を利用して勾配方向に重みの値を更新する作業を繰り返す
  • 微小な値を与えた時の差分によって微分を求めること数値微分という。
  • 数値微分によって、重みパラメータの勾配を求めることができる
  • 数値微分による計算には時間がかかるが実装はカンタン。一方、実装はやや複雑な誤差逆伝播法は、高速に勾配を求めることができる

第5章 誤差逆伝播

ココでは、

重みパラメータの勾配の計算を効率よく行える誤差逆伝播法」について学ぶ


5.1.1 計算グラフで解く

カンタンな計算グラフを解いてみる



問1:太郎君はスーパーで1個100円のリンゴを2個買いました。支払う金額は?ただし消費税は10%適用。


計算グラフで解くとこんな↓かんじ。


f:id:fukuko-parallel-work:20211115201751j:plain


答えは、220!


今日のまとめ


ハイ、今日はここまで!!

ふう、やーっと第4章が終わりました!!

つづいて、第5章の誤差逆伝播法についてです。

引き続き頑張りまっす。


最後まで読んでくださり、ありがとうございます!

フクコ


ディープラーニング入門書おススメ本