ゼロから作るDeep Learning(8日目)

こんにちは、筋肉めがねです。

 

久しぶりに、朝ジムを楽しんできました。10月下旬は2週間程度ジムに行けなかったのですが、今週から再度ジムに行き始め、ようやく感覚を取り戻しつつあります。そんな僕を勇気づけてくれる論文を見つけました。今年1月にpublishされたこちらの論文です。

Human Skeletal Muscle Possesses an Epigenetic Memory of Hypertrophy | Scientific Reports

内容は通称「マッスルメモリー」と呼ばれる運動の記憶が筋肉の遺伝子に蓄積される、というもの。ある程度の負荷をかけた動作を、例えば3ヶ月など定期的に継続して行うと、その動作にどの筋肉を使うのか、どの筋繊維を増大させる必要があるのか、という情報を筋肉の遺伝子が覚えます。そして、一定期間休養後にトレーニングを再開すると、筋肉の遺伝子に記憶された情報により、トレーニングを開始する当初よりも増して効率良く動作を行う事ができ、そして以前よりも短期間で効率良く筋肥大させる事ができる、というものです。朗報ですね。

 

f:id:KinnikuMegane:20181110035607j:plain

 

それでは、本日も「ゼロから作るDeep Learning」を進めて行きましょう。

 

前回の記事では、手書き数値画像の分類を行う3層のニューラルネットワークを作り、実際に10,000枚の画像を使って認識精度を検証しました。そして、93.52%の精度で、ニューラルネットワークが画像に載っている数値を正しく判断する、という事を確認しましたね。

 

本日は、3章の最後、バッチ処理を見ていきます。

バッチ処理っていうのは、ある程度のトランザクションを一度に纏めて行う事ですね。

 

前回の記事では、 10,000枚の画像を1枚づつニューラルネットワークに入力し、処理していました。今回のバッチ処理では100枚づつ読み込んでいきます。

 

最初にコードを示しましょう。

#先ずは本書で紹介されているMNISTという手書き数字画像セットを準備します。
#Terminal上で
git clone https://github.com/oreilly-japan/deep-learning-from-scratch.git

#そして、本書で紹介されている通り、ディレクトリch01からch08のうちの1つに入ります。例えばch03のディレクトリに入ります。
cd deep-learning-from-scratch/ch03

#ch03のディレクトリ直下で、python環境下に入る。
python

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

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

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

 

前回との違いはbatch_size = 100以降です。前回は1枚の画像のピクセル数である784(28x28)個の入力層に対して、各ピクセルの情報(0から255までの値を取りうる)を入力しておりました。今回は、入力層にもう1次元加えます。それで、100枚の画像を一度に処理するんですね。 そして、出力層でも、前回から1次元加え、[100 x 10]、つまり、100枚の画像それぞれに対して、10個の配列が出力される、というイメージです。10個の配列とは、例えば[0, 0, 1, 0, 0, 0, 0, 0, 0, 0]というものでした。配列の要素は0から数えるので、この場合の解は2でした。

バッチ処理をすることで、高速に処理できる、これが今回の大事なところです。

 

それでは、本日は以上でございます。

次は4章ですね。