Djangoroidの奮闘記

python,django,angularJS1~三十路過ぎたプログラマーの奮闘記

Python DeepLearningに再挑戦 6 ニューラルネットワーク〜バッチ処理

概要

Python DeepLearningに再挑戦 6 ニューラルネットワークバッチ処理

参考書籍

バッチ処理

前の記事で扱った、MNISTの画像の判断の実装を細かく見ていく

x, _ = get_data()
network = init_network()
W1, W2, W3 = network['W1'], network['W2'], network['W3']
x.shape # (10000, 784)
x[0].shape # (784,)
W1.shape # (784, 50)
W2.shape # (50, 100)
W3.shape # (100, 10)

各要素が一致するようになっている。 これを100枚まとめてのバッチ処理にすることも可能。

f:id:riikku:20161221073847p:plain

バッチ処理の実装

x, t = get_data()
network = init_network()
batch_size = 100 # 1つのバッチの数の設定?
accuracy_cnt = 0

for i in range(0, len(x), batch_size): # range(start, end, step) -> range(0, 10000, 100)とかいう意味になるはず
    x_batch = x[i:i+batch_size] # i番目からi+batch_sizeまでをゲットする。初回は、x[0:0+100]という意味になるはず。 2回目は、x[100:100+100]、3回目は、x[200:200+100]という感じでスライドしていく。
    y_batch = predict(network, x_batch)
    p = np.argmax(y_batch, axis=1) # 最大値のインデックスを取得する。# axis=1というのは、1次元目の要素ごとに(1次元を軸として)最大値のインデックスを見つける。つまり一番確率が高いと思われるインデックスを取得する。
    accuracy_cnt += np.sum(p == t[i:i+batch_size])# 

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

argmaxのところちょっとむずい。。。具体的な例では以下のような感じらしい。

x = np.array([[0.1, 0.8, 0.1], [0.3, 0.1, 0.6],[0.2, 0.5, 0.3], [0.8, 0.1, 0.1]])
y = np.argmax(x, axis=1)
print(y)
[1 2 1 0]

今回のケースだと、各要素に10個数値が並んでいて、一番数値が大きいインデックスをゲットする。 x = np.array([[0.1, 0.05, 0.05,.....][1,1,...]])みたいな感じで一番大きい要素のインデックスを取得する。

f:id:riikku:20161221080959p:plain

accuracy_cnt += np.sum(p == t[i:i+batch_size])は、[True True False True ..... ]みたいな感じで、Booleanを返して、それを数値化して、Trueの数を合計する。

このようなバッチ処理は、高解像度の画像などの解析をするときに使ったりすると効率的らしい。