こんにちは!
現役パラレルワーカー フクコです。
前回の記事↓に続き
来年の2月の試験に向けてE資格試験勉強中のため
ゼロつくシリーズでおなじみ
オーライリーから出版されている
ディープラーニングの本格的な入門書でよくおススメされる
「ゼロからつくる Deep Learning」
この本↑を毎日5ページずつコツコツこなすと
約2か月間で今年中に終了するので
来年のE資格試験までにこれで基礎力をつけることにしました。(^^)
ついつい私は何もないとだらけてしまうので(笑)
毎日5ページ終わった後の記録とまとめを書いていこうと思います。
と、まとめに入る前に…
やる気を出すためのコトバをシェアします!!(主に私のやる気を出すために 笑)
「1日1日を無駄に消費せず、毎日を価値あるものにせよ。」
"Don’t count the days. Make the days count."
by モハメド・アリ
アメリカの超有名なボクサーチャンピオンモハメド・アリの名言です。
結局、毎日コツコツが勝つ!!
というコトで、今日もムダに時間を過ごさないために、私はノルマコツコツこなしますよ! 笑
よし、今日も頑張るぞ~! お~!!
ではでは、いい加減まとめに入ります。笑
その前に本の目次の紹介です。
ゼロつくディープラーニングは、下記↓の合計8章で構成されています。
本の目次
- 1章 Python入門
- 2章 パーセプトロン
- 3章 ニューラルネットワーク
- 4章 ニューラルネットワークの学習
- 5章 誤差伝播法
- 6章 学習に関するテクニック
- 7章 畳み込みニューラルネットワーク
- 8章 ディープラーニング
ちなみに…
ゼロつくディープラーニングの第1章はPython入門のセクション(20ページ分)なので、
とりあえず今回私は飛ばし、第2章からまとめています。
今回もひきつづき第3章からでーす。
3.6.2 ニューラルネットワークの推論処理
3つの関数、def get_data()、def init_network()、def predict()を定義する。
#まずは、pickleファイル、システムのディレクトリ、NumPyインストール、データのロード import pickle import sys, os sys.path.append(os.pardir) import numpy as np#Numpyをインストール from dataset.mnist import load_mnist from PIL import Image #Mnistデータを取ってくる #load_mnist関数で、MNISTデータを読みこみ #flatten = > 入力画像を平らにするかどうか #normalize =>入力画像を正規化(0~1)か、そのままにするか def get_data(): (x_train, t_train),(x_test, t_test) = load_mnist(normalize=True,flatten=True, one_hot_label=False) return x_test, t_test #pickleファイルにある重みとバイアスのデータが保存されているのをあける def init_network(): with open("sample_weight.pkl", 'rb') as f: network = pickle.load(f) return network #シグモイド関数定義 def sigmoid(x): return 1 / (1 + np.exp(-x)) # ソフトマックス関数の定義 def softmax(a): exp_a = np.exp(a) sum_exp_a = np.sum(exp_a) y = exp_a / sum_exp_a return y #ニューラルネットワークの予測 def predict(network, x): W1, W2, W3 = network['W1'], network['W2'], network['W3'] b1, b2, b3 = network['b1'], network['b2'], network['b3'] a1 = np.dot(x, W1) + b1 z1 = sigmoid(a1) a2 = np.dot(z1, W2) + b2 z2 = sigmoid(a2) a3 = np.dot(z2, W3) + b3 y = softmax(a3) return y
補足:pickleファイルとは何か??
pickleファイルとは、Pythonオブジェクトをファイルとして保存し、呼び出せるようにすることができる形にするためのライブラリ
import pickleで、ファイルの読み込みが出来るようになる。
定義した3つの関数を使って、ニューラルネットワークによる推論処理を
Pythonで行うと以下↓のとおり。
x, t = get_data()#Nmistでーたを取得して、x, tに格納。 network = init_network() accuracy_cnt = 0 for i in range(len(x)): y = predict (network, x[i])#predict関数の結果は各ラベルの確率がNumPy配列で出力される。 p = np.argmax(y)#最も確率の高い要素のインデックスを取得
↑のようにpredict関数の結果は各ラベルの確率がNumPy配列で出力される。
以上↑のコードを実行すると、
最終的な結果として
Accuracy: 0.9352と表示される。
これは、93.52%正しく分類することができた、というコト。
実行結果の一部:
```
Accuracy:0.9339
Accuracy:0.9339
Accuracy:0.934
Accuracy:0.9341
Accuracy:0.9342
Accuracy:0.9343
Accuracy:0.9344
Accuracy:0.9345
Accuracy:0.9346
Accuracy:0.9347
Accuracy:0.9348
Accuracy:0.9349
Accuracy:0.935
Accuracy:0.9351
Accuracy:0.9352
```
3.6.3 バッチ処理
バッチ (Batch)とは、まとまりのある入力データのコト。
x, _ = get_data() network = init_network() W1, W2, W3 = network['W1'], network['W2'], network['W3'] print(x.shape)#答えは、(10000, 784) print(x[0].shape)#答えは、(784,) print(W1.shape)#答えは、(784, 50) print(W2.shape)#答えは、(50, 100) print(W3.shape)#答えは、(100, 10)
↑の結果から、多次元配列の対応する次元の要素数が一致していることが確認できる。
x, t = get_data() network = init_network() batch_size = 100#バッチの数 accuracy_cnt = 0 for i in range(0, len(x), batch_size): x_batch = x[i:i+batch_size] y_batch = predict(network, x_batch) p = np.argmax(y_batch, axis=1) accuracy_cnt += np.sum(p == t[i:i+batch_size]) print("Accuracy:"+ str(float(accuracy_cnt)/len(x)))#答えは、Accuracy:0.9352 #len関数は、引数に指定したオブジェクトの長さや要素の数を取得 |< 最後に、<u><strong>バッチ単位で分類した結果と、実際の答えを比較</strong></u>する。 Pythonで実装すると↓のとおり。 >|python| # 最後に、バッチ単位で分類した結果と、実際の答えを比較する。 y = np.array([1,2,1,0]) t = np.array([1,2,0,0]) print(y==t)#答えは、[ True True False True]
第3章のまとめ
- ニューラルネットワークの順伝播(forward propagation)についての解説。
- ニューラルネットワークでは、活性化関数としてシグモイド関数やReLU関数のような滑らかに変化する関数を利用する。
- NumPyの多次元配列を上手く使うことで、ニューラルネットワークを効率よく実装することができる。
- 機械学習のモンダイは、回帰問題と分類問題に分かれる。
- 出力層で使用する活性化関数は、回帰問題では恒等関数、分類問題ではソフトマックス関数が一般的に利用される。
- 分類問題では、出力層のニューロン数を分類するクラス数に設定する。
- 入力データのまとまりを「バッチ」とよび、バッチ単位で推論処理をおこなうことで、計算の高速化が可能。
今日のまとめ
ハイ、今日はここまで!!
ということで、第3章のニューラルネットワーク無事終わりました!!(^^)
あともう5章です~! ウーム、道のりは長い。笑
引き続き頑張りまっす。
最後まで読んでくださり、ありがとうございます!
フクコ
ディープラーニング入門書おススメ本