▼ 下記ページを理解していること。
[Python] [5] MNISTのダウンロード方法 (手書き数字画像セットを取込む)
[Python] [6] MNISTを使ったニューラルネットワークの推論処理と実装サンプル
▼ Python3.6、NumPyがインストールされていること。
このページでは、venvの仮想環境(Python3.6)上にNumPyをインストールした環境で、Python対話モード(Pythonインタプリタ)にて実装サンプルを記載している。
※ Python対話モード、NumPyについては下記を参考。
Python対話モード:[Python] 対話モード (インタプリタ) の使用方法
NumPy:[Python] [NumPy] インストールとnumpy.ndarrayの使用方法
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)))
$ cd gitlocalrep
$ cd deep-learning-from-scratch/ch03
$ source /var/www/vops/bin/activate
$ python neuralnet_mnist_batch.py
Accuracy:0.9352
x, t = get_data()
network = init_network()
batch_size = 100 # … (1)
accuracy_cnt = 0
for i in range(0, len(x), batch_size): # … (2)
x_batch = x[i:i+batch_size] # … (3)
y_batch = predict(network, x_batch) # … (4)
p = np.argmax(y_batch, axis=1) # … (5)
accuracy_cnt += np.sum(p == t[i:i+batch_size]) # … (6)
print("Accuracy:" + str(float(accuracy_cnt) / len(x)))
$ python
>>> list(range(0, 10)) # 0 ~ 10 までの配列
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
>>> list(range(5, 10)) # 5 ~ 10 までの配列
[5, 6, 7, 8, 9]
>>> list(range(1, 27, 3)) # 1 ~ 27 までのインデックスを 3 ずつ増加
[1, 4, 7, 10, 13, 16, 19, 22, 25]
※ predict(network, x_batch)のsigmoid, softmaxについては、下記を参考。
[Python] [3] ニューラルネットワークの活性化関数と実装サンプル
[Python] [4] 活性化関数の実装サンプルまとめ(ステップ / シグモイド / ReLU / 恒等関数 /ソフトマックス関数)
$ python
>>> import numpy as np
>>> x = np.array([[0.1, 0.3, 0.2, 0.9, 0.5], [0.3, 0.9, 0.1, 0.4, 0.8], [0.9, 0.2, 0.1, 0.6, 0.5]])
>>> y = np.argmax(x, axis=1)
>>> print(y)
[3 1 0]
>>>
$ python
>>> import numpy as np
>>> x = np.array([[0.1, 0.3, 0.2, 0.9, 0.5], [0.3, 0.9, 0.1, 0.4, 0.8], [0.9, 0.2, 0.1, 0.6, 0.5]])
>>> y = np.argmax(x, axis=0)
>>> print(y)
[2 1 0 0 1]
>>>
$ python
>>> import numpy as np
>>> p = np.array([0.1, 0.3, 0.2, 0.9, 0.5, 0.3, 0.9, 0.1, 0.4, 0.8])
>>> t = np.array([0.1, 0.4, 0.2, 0.9, 0.5, 0.4, 0.9, 0.2, 0.5, 0.9])
>>> print(p==t)
[ True False True True True False True False False False]
>>> np.sum(p==t)
5
>>>