2017年07月22日

ブログのデザインを変更しました!

storage.mantan-web.jp_images_2017_05_21_20170521dog00m200017000c_001_size8.jpg

デザインを変更しました。

両サイドバーのデザインから右サイドバーのデザインに変更しました。

プログラムのソースコードが少しだけ見やすくなったかと思います。

posted by tsurutsuru at 18:07| Comment(0) | 日常茶飯事

ディープラーニング本のサンプルプログラム(1)・・・3章のneuralnet_mnist.py

storage.mantan-web.jp_images_2017_05_21_20170521dog00m200017000c_001_size8.jpg

deeplearning1.jpg

この本を学習しています。この本の構成は以下の通りです。

1章 Python入門
2章 パーセプトロン
3章 ニューラルネットワーク
4章 ニューラルネットワークの学習
5章 誤差逆伝播法
6章 学習に関するテクニック
7章 畳み込みニューラルネットワーク
8章 ディープラーニング
付録A Softmax-with-Loss レイヤの計算グラフ
参考文献

各章のサンプルプログラムを実行して結果とソースコードを紹介しています。

この回では3章で紹介されているサンプルプログラムです。

ファイル名:neuralnet_mnist.pr
------------------------------------------------
# coding: utf-8
import sys, os
sys.path.append(os.pardir) # 親ディレクトリのファイルをインポートするための設定
import numpy as np
import pickle
from dataset.mnist import load_mnist
from common.functions import sigmoid, softmax


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


def init_network():
with open("sample_weight.pkl", 'rb') as f:
network = pickle.load(f)
return network


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


x, t = get_data()
network = init_network()
accuracy_cnt = 0
for i in range(len(x)):
y = predict(network, x[i])
p= np.argmax(y) # 最も確率の高い要素のインデックスを取得
if p == t[i]:
accuracy_cnt += 1

print("Accuracy:" + str(float(accuracy_cnt) / len(x)))
------------------------------------------------

このプログラムはとても参考になるプログラムで、いろいろなことに応用できます。

まず初めて実行するすると、次のような表示が出てきます。

初めて実行すると
(親ディレクトリ)\ch03>python neuralnet_mnist.py
Downloading train-images-idx3-ubyte.gz ...
Done
Downloading train-labels-idx1-ubyte.gz ...
Done
Downloading t10k-images-idx3-ubyte.gz ...
Done
Downloading t10k-labels-idx1-ubyte.gz ...
Done
Converting train-images-idx3-ubyte.gz to NumPy Array ...
Done
Converting train-labels-idx1-ubyte.gz to NumPy Array ...
Done
Converting t10k-images-idx3-ubyte.gz to NumPy Array ...
Done
Converting t10k-labels-idx1-ubyte.gz to NumPy Array ...
Done
Creating pickle file ...
Done!
Accuracy:0.9352

2回目以降は次のように出ます。
(親ディレクトリ)\ch03>python neuralnet_mnist.py
Accuracy:0.9352

要するにMNISTの画像データがない場合はWEBサイトからPCに自動ダウンロードしてから、プログラムを実行してテスト画像1万枚の識別の正解率を表示します。

PCにMNISTの画像データがある場合は正解率を表示します。

正解率は93.62%もあります。このプログラムはすでに学習したパラメータを利用していますが、1万回テストして9362回も正解しています。手書きの数字の判別です。すごいですね。

このプログラムの核心はpredict(network, x)の定義の中の次の部分です(あくまで私の理解です)。

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)

文字なので単純な数を扱っているように見えますが、すべて多次元配列です。

keijyo1.jpg

この処理を100枚ずつのバッチ処理で行ったのが、次のプラグラムです。

ファイル名:neuralnet_mnist_batch.pr
------------------------------------------------
# coding: utf-8
import sys, os
sys.path.append(os.pardir) # 親ディレクトリのファイルをインポートするための設定
import numpy as np
import pickle
from dataset.mnist import load_mnist
from common.functions import sigmoid, softmax


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


def init_network():
with open("sample_weight.pkl", 'rb') as f:
network = pickle.load(f)
return network


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


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)))
------------------------------------------------

当然ながら実行結果はneuralnet_mnist.prの実行結果と同じになります。

(親ディレクトリ)\ch03>python neuralnet_mnist_batch.py
Accuracy:0.9352

そして形状は次のようになります。

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)

keijyo2.jpg

この辺は数学の行列に慣れている人にはすんなり理解できると思います。

こんなところからもPythonは数学や物理などでも有用な機械学習言語だと分かりますねえ。

今回はこれで終了です。




posted by tsurutsuru at 14:29| Comment(0) | 日常茶飯事