2017年07月26日

学習本の3章のサンプルプログラムneuralnet_mnist.prをも少し詳しく解説してみます(1)

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.py
----------------------------------------------------------------------
# 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)))
----------------------------------------------------------------------

このプログラムを私流に少し掘り下げてみます。

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)

この部分を実際の画像データを使って数値の変化を追ってみます。

手書き画像は次の7の画像とします。

数字7-1.jpg

この手書き画像のデータは以下の通りです。

gazou7data1.jpg
(画像をクリックすると拡大して見れます)

元データは(784,)ですが、(28,28)にしてあります。

このデータが入力されると、次のように値が変わっていきます。x[0]には正規化された入力画像データが入っています。正規化とは元データを255で除算してデータが0〜1の範囲になるようにすることです。ですから、0〜255の値が0〜1になっています。

hyo1.jpg
(画像をクリックすると拡大して見れます)

小さくて見づらいので左側だけ取り出してみます。

hyo11.jpg

yの値の行だけ取り出すと次のようになります。

hyo12.jpg

見やすくするため2段にしてあります。

yの値をすべて足すと1になります。ですから、yの値は確率と同等の意味になります。

これをみると7が99.7%だと分かります。

それでプログラムは入力された手書きの画像データを7と判別します。正解です。

こんな風にプログラムは手書きの画像データの数字を判別しています。

面白いですね。

最後にプログラムに出てくる sigmoid関数のグラフを描いてみます。

sigmoid()

Figure_32.png

このグラフを描くプログラムは以下の通りです。 sigmoid関数の定義もこれを見ると分かります。

ファイル名: sigmoid.py
-----------------------------------------------------------------
# coding: utf-8
import numpy as np
import matplotlib.pylab as plt


def sigmoid(x):
return 1 / (1 + np.exp(-x))

X = np.arange(-5.0, 5.0, 0.1)
Y = sigmoid(X)
plt.plot(X, Y)
plt.ylim(-0.1, 1.1)
plt.show()
-----------------------------------------------------------------

今回はここまでです。

posted by tsurutsuru at 11:28| Comment(0) | 日常茶飯事

2017年07月24日

ディープラーニング本のサンプルプログラム(2)・・・3章のmnist_show.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 レイヤの計算グラフ
参考文献

この学習本のサンプルプログラムを紹介しています。

今回は次のプログラムです。

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


def img_show(img):
pil_img = Image.fromarray(np.uint8(img))
pil_img.show()

(x_train, t_train), (x_test, t_test) = load_mnist(flatten=True, normalize=False)

img = x_train[0]
label = t_train[0]
print(label) # 5

print(img.shape) # (784,)
img = img.reshape(28, 28) # 形状を元の画像サイズに変形
print(img.shape) # (28, 28)

img_show(img)
----------------------------------------------------------------

実行結果は次のような画像が表示されます。

図1.jpg

真ん中の部分を拡大すると次のようになります。

数字5-1.jpg

手書きの数字の5ですが、手書きなので個人のクセがあり少し判別しづらいですね。でも、ディープラーニングだとこういう手書きの5でも数字の5だと判別するのです。

ちなみにこの手書きの5のデータは次のようになっています(28×28形式にしてあります)。

gazou5data1.jpg
(※画像をクリックすると拡大して見れます。)

数値は0〜255までの値を取ります。この値によって白黒の濃淡が決まります。

それでExcelのセルの背景にこの値を反映させて濃淡をつけてみたのが次の図です。

gazou5data2.jpg

オリジナルを再現しています。

なかなか面白いですね。

今回はここまでです。

posted by tsurutsuru at 11:52| Comment(0) | 日常茶飯事

2017年07月22日

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

storage.mantan-web.jp_images_2017_05_21_20170521dog00m200017000c_001_size8.jpg

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

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

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

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