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

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

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

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


こんにちは!

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

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




前回の記事↓に続き

www.fukuko-parallel-work.com





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


E資格とは?の記事はコチラ↓

www.fukuko-parallel-work.com




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

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

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

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


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





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

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

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


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

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


と、まとめに入る前に…

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

「それに化かし合いなら僕は負けないよ。


これは驕りでも自信過剰でも無い ”覚悟”だ」


by ノーマン


私の大好きな約束のネバーランド」(約ネバ)から

ノーマンの名言です。


ノーマン約ネバに登場する主人公の一人です。 

4歳でテスト開始以降、満点以外とったことがない超天才児

そして、エマがめっちゃ大好き!笑

鬼から逃げて“全員で脱獄”というエマからの無茶ぶりに果敢に挑んでいきます


私、最近つくづく思うんですよね。 

結局のところ

何か勝負事をしたときにそのヒトが勝つのか負けるのかの分かれ目って 

そのヒトにどれだけ「覚悟」☆彡があるのか次第だな~と。


今でこそ投資も仕事もなんとか順調にまわせるようになりましたが

以前の私はホントに何をやるにしても空回りすぎて、空振り過ぎて。。

ぜ~んぜん何もかも上手くいかなくて…(涙)


今思えば

投資

「ししょ―に教えてもらえば大丈夫!」

仕事

「上司に相談すれば大丈夫!」

本人は無自覚ながら

ぜ~んぶ責任やらもろもろを他人に押し付けていたんですよね…


そりゃーうまくいきっこない!!ですよ!苦笑

なので

自分の日々の行動は、モチロン自己責任 

できるかできないかは、自分の覚悟☆彡次第!



ノーマン、どうもありがとう! (^0^)

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

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

というコトで、今日も努力の継続!ノルマをこなしますよ! 笑


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




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

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

本の目次

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



ちなみに…

ゼロつくディープラーニング第1章はPython入門のセクション(20ページ分)なので、

とりあえず今回私は飛ばし、第2章からまとめています。

今回も引き続き、第5章のつづきからでーす。



第5章 誤差逆伝播法のつづき

ココでは、

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

5.7 誤差逆伝播法の実装


今まで実装してきたレイヤを組み合わせることで

まるでレゴブロックを組み合わせるごとく

ニューラルネットワークを構築することができる


5.7.1 ニューラルネットワークの学習の全体図


具体的な実装に入る前に、

ニューラルネットワーク学習の手順のちょっとおさらい

この重みとバイアスを訓練データに適応すル様に調整することを「学習」とよぶ。


学習するには下記の↓の4ステップを行う。

  • ステップ1(ミニバッチ)

   訓練データの中からランダムに一部のデータを選び出す

  • ステップ2(勾配の算出)

   各重みパラメータに関する損失関数の勾配を求める

  • ステップ3(パラメータの更新)

   重みパラメータを勾配方向に微笑量だけ更新する

  • ステップ4(繰り返す)

   ステップ1~3を繰り返して、学習


⁂ 誤差逆伝播法を使用すれば、

時間がかかる数値微分とは違い高速に効率よく勾配を求めることができる

5.7.2 誤差逆伝播法に対応したニューラルネットワークの実装


誤差逆伝播法に対応したニューラルネットワークの実装を行っていく。

ここでは

2層のニューラルネットワークをTwoLayerNetとして実装していく。


# 5.7.2 誤差逆伝播法に対応したニューラルネットワークの実装

# まずはライブラリとかをインポート
import sys, os
sys.path.append(os.pardir)
import numpy as np
from common.layers import *
from common.gradient import numerical_gradient
from collections import OrderedDict#OrderedDictは「順番付き」のディクショナリ、逆伝播でレイヤを逆の順番にできる

class TwoLayerNet:
    
    def __init__(self, input_size, hiddent_size, output_size, weight_init_std = 0.01):
        #重みの初期化
        self.params = {}
        self.params['W1'] = weight_init_std * np.random.randn(input_size, hidden_size)
        self.params['b1'] = np.zeros(hidden_size)#要素の値が全てゼロの配列を作成するにはzeros()関数を使用
        self.params['W2'] = weight_init_std * np.random.randn(hidden_size, output_size)#平均0、標準偏差1の正規分布の乱数を生成する関数
        self.params['b2'] = np.zeros(output_size)#要素の値が全てゼロの配列を作成するにはzeros()関数を使用
        
        #レイヤの生成
        self.layers = OrderedDict()
        self.layers['Affine1'] = Affine(self.params['W1'], self.params['b1'])
        self.layers['Relu1'] = Relu()
        self.layers['Affine2'] = Affine(self.params['W2'], self.params['b2'])
        
        self.lastLayer = SoftmaxWithLoss()
        
    def predict(self, x):
        for layer in self.layers.values():
            x = layer.forward(x)
            
            return x
    
    #x:入力データ、t:教師データ
    
    def loss(self, x, t):
        y = self.predict(x)
        return self.lastLayer.forward(y, t)
    
    def accuracy(self, x, t):
        y = self.predict(x)
        y = np.argmax(y, axis = 1)
        if t.ndim != 1 : t = np.argmax(t,  axis=1)
        
        accuracy = mp.sum(y == t) / float(x.shape[0])
        return accuracy
    
    #x:入力データ、t:教師データ
    
    def numerical_gradient(self, x, t):
        loss_W = lambda W: self.loss(x, t)
        
        grads = {}
        grads['W1'] = numerical_gradient(loss_W, self.params['W1'])
        grads['b1'] = numerical_gradient(loss_W, self.params['b1'])
        grads['W2'] = numerical_gradient(loss_W, self.params['W2'])
        grads['b2'] = numerical_gradient(loss_W, self.params['b2'])

        return grads
    
    def gradient(self, x, t):
        
        # forward
        self.loss(x,t)
        
        # backward
        dout = 1
        dout = self.lastLayer.backward(dout)
        
        layers = list(self.layers.values())
        layers.reverse()
        for layer in layers:
            dout = layer.backward(dout)
            
        #設定
        grads = {}
        grads['W1'] = self.layers['Affine1'].dW
        grads['b1'] = self.layers['Affine1'].db
        grads['W2'] = self.layers['Affine2'].dW
        grads['b2'] = self.layers['Affine2'].db
        
        return grads


補足

アフィン変換(Afffine)平行移動と線形変換を組み合わせた変換


↑で使用されているクラスのメソッドの説明

  •  __init__(self, input_size, hiddent_size, output_size, weight_init_std = 0.01) : 初期化
  •  predict(self, x) : 認識(推論)を行う。xは画像データ
  •  loss(self, x, t) :損失関数の値
  •  accuracy(self, x, t) :認識精度を求める
  •  numerical_gradient(self, x, t) :重みパラメータに対する勾配を数値微分で求める
  •  gradient(self, x, t) :重みパラメータに対する勾配を誤差逆伝播法により求める


↑で使用されている変数の説明


↑で使用されている関数の簡単な説明

  •  np.zeros

 要素の値が全てゼロの配列を作成するにはzeros()関数を使用

  •  np.random.randn

 平均0、標準偏差1の正規分布の乱数を生成する関数

  •  np.argmax

 多次元配列の中の最大値の要素を持つインデックスを返す関数


このように、

ニューラルネットワークの構成要素を「レイヤ」として実装したことで

ニューラルネットワークをカンタンに構築できる


もっと大きな層のニューラルネットワークを作りたい!なら

単に必要なレイヤを追加するだけニューラルネットワークを作ることができる


今日のまとめ


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

第5章の誤差逆伝播法はあともう少し!

引き続き頑張りまっす。


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

フクコ


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


E資格とは?

www.fukuko-parallel-work.com