こんにちは!
現役パラレルワーカー フクコです。
前回の記事↓に続き
来年の2月の試験に向けてE資格試験勉強中のため
E資格とは?の記事はコチラ↓
ゼロつくシリーズでおなじみ
オーライリーから出版されている
ディープラーニングの本格的な入門書でよくおススメされる
「ゼロからつくる Deep Learning」本
この本↑を毎日5ページずつコツコツこなすと
約2か月間で今年中に終了するので
来年のE資格試験までにこれで基礎力をつけることにしました。(^^)
ついつい私は何もないとだらけてしまうので(笑)
毎日5ページ終わった後の記録とまとめを書いていこうと思います。
と、まとめに入る前に…
やる気を出すためのコトバをシェアします!!(主に私のやる気を出すために 笑)
「それに化かし合いなら僕は負けないよ。
これは驕りでも自信過剰でも無い ”覚悟”だ」
by ノーマン
私の大好きな「約束のネバーランド」(約ネバ)から
ノーマンの名言です。
ノーマンは約ネバに登場する主人公の一人です。
4歳でテスト開始以降、満点以外とったことがない超天才児。
そして、エマがめっちゃ大好き!笑
鬼から逃げて“全員で脱獄”というエマからの無茶ぶりに果敢に挑んでいきます。
私、最近つくづく思うんですよね。
結局のところ
何か勝負事をしたときにそのヒトが勝つのか負けるのかの分かれ目って
そのヒトにどれだけ「覚悟」☆彡があるのか次第だな~と。
今でこそ投資も仕事もなんとか順調にまわせるようになりましたが
以前の私はホントに何をやるにしても空回りすぎて、空振り過ぎて。。
ぜ~んぜん何もかも上手くいかなくて…(涙)
今思えば
投資は
「ししょ―に教えてもらえば大丈夫!」
仕事は
「上司に相談すれば大丈夫!」と
本人は無自覚ながら
ぜ~んぶ責任やらもろもろを他人に押し付けていたんですよね…
そりゃーうまくいきっこない!!ですよ!苦笑
なので
自分の日々の行動は、モチロン自己責任!
できるかできないかは、自分の覚悟☆彡次第!
ノーマン、どうもありがとう! (^0^)
今日もやる気が出てきました!
よし!! 今日も頑張るぞ~! お~!!
というコトで、今日も努力の継続!ノルマをこなしますよ! 笑
ではでは、いい加減まとめに入ります。笑
その前に本の目次の紹介です。
ゼロつくディープラーニングは、下記↓の合計8章で構成されています。
本の目次
- 1章 Python入門
- 2章 パーセプトロン
- 3章 ニューラルネットワーク
- 4章 ニューラルネットワークの学習
- 5章 誤差伝播法
- 6章 学習に関するテクニック
- 7章 畳み込みニューラルネットワーク
- 8章 ディープラーニング
ちなみに…
ゼロつくディープラーニングの第1章はPython入門のセクション(20ページ分)なので、
とりあえず今回私は飛ばし、第2章からまとめています。
今回も引き続き、第5章のつづきからでーす。
5.7 誤差逆伝播法の実装
今まで実装してきたレイヤを組み合わせることで
まるでレゴブロックを組み合わせるごとく
ニューラルネットワークを構築することができる。
5.7.1 ニューラルネットワークの学習の全体図
具体的な実装に入る前に、
ニューラルネットワーク学習の手順のちょっとおさらい。
- 前提:ニューラルネットワークは、適応可能な重み(w)とバイアス(b)があり、
この重みとバイアスを訓練データに適応すル様に調整することを「学習」とよぶ。
学習するには下記の↓の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):平行移動と線形変換を組み合わせた変換
↑で使用されているクラスのメソッドの説明
- : 初期化
- : 認識(推論)を行う。xは画像データ。
- :損失関数の値
- :認識精度を求める
- :重みパラメータに対する勾配を数値微分で求める
- :重みパラメータに対する勾配を誤差逆伝播法により求める。
↑で使用されている変数の説明
- : ニューラルネットワークのパラメータを保持するディクショナリ変数
- :ニューラルネットワークのレイヤを保持する順番付きディクショナリ変数
- :ニューラルネットワークの最後のレイヤ、この↑例ではSoftmaxWithLossレイヤ
↑で使用されている関数の簡単な説明
要素の値が全てゼロの配列を作成するにはzeros()関数を使用
多次元配列の中の最大値の要素を持つインデックスを返す関数
このように、
ニューラルネットワークの構成要素を「レイヤ」として実装したことで
ニューラルネットワークをカンタンに構築できる。
もっと大きな層のニューラルネットワークを作りたい!なら
単に必要なレイヤを追加するだけでニューラルネットワークを作ることができる。