Python DeepLearningに再挑戦 6 ニューラルネットワーク〜バッチ処理
概要
Python DeepLearningに再挑戦 6 ニューラルネットワーク〜バッチ処理
参考書籍
ゼロから作るDeep Learning ―Pythonで学ぶディープラーニングの理論と実装
- 作者: 斎藤康毅
- 出版社/メーカー: オライリージャパン
- 発売日: 2016/09/24
- メディア: 単行本(ソフトカバー)
- この商品を含むブログ (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枚まとめてのバッチ処理にすることも可能。
バッチ処理の実装
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,...]])
みたいな感じで一番大きい要素のインデックスを取得する。
accuracy_cnt += np.sum(p == t[i:i+batch_size])
は、[True True False True ..... ]みたいな感じで、Booleanを返して、それを数値化して、Trueの数を合計する。
このようなバッチ処理は、高解像度の画像などの解析をするときに使ったりすると効率的らしい。