ラビットチャレンジ　レポート　深層学習 day 2

## 0. 復習
確認テスト1
連鎖律の原理を使い、dz/dxを求めよ。
$$\frac{dz}{dx}=\frac{dz}{dt}\times\frac{dt}{dx}$$

```math
\left\{
\begin{array}{l}
\frac{dz}{dt}=2t \\
\frac{dt}{dx}=1 
\end{array}
\right.
```
より
$$\frac{dz}{dx}=\frac{dz}{dt}\times\frac{dt}{dx}=2t\times 1=2(x+y)$$


## 1. 勾配消失問題
誤差逆伝播法が下位層に進んでいくに連れて、勾配がどんどん緩やかになっていく。そのため、勾配降下法による、更新では下位層のパラメータはほとんど変わらず、訓練は最適値に収束しなくなる。

シグモイド関数
0-1の間を緩やかに変化する関数で、ステップ関数ではON/OFFしかない状態に対し、信号の強弱を伝えられるようになり、予想ニューラルネットワーク普及のきっかけとなった。
大きな値では出力の変化が微小なため、勾配消失問題を引き起こす事があった。

確認テスト1
・シグモイド関数を微分した時、入力値が0の時に最大値をとる。その値として正しいものを選択肢から選べ。
0.25

勾配消失の解決方法
・活性化関数の選択
→ReLU関数、微分した結果が$x\leqq 0$ の時は $0$、$x>0$の時は、$1$となる。そのため、勾配消失問題が解消できる。
・重みの初期値設定
→Xavierの初期値、Heの初期値
・バッチ正規化
→ミニバッチ単位で入力値のデータの偏りを抑制する

確認テスト2
・重みの初期値に0を設定すると、どのような問題が発生するか。簡潔に説明せよ。
すべての重みの値が均一に更新されることになるため、多数の重みをもつ意味がなくなり、正しい学習が行えない。

確認テスト3
・一般的に考えられるバッチ正規化の効果を2点挙げよ。
計算が高速で、過学習を抑えることができる。
中間層の重みの安定度が増し、勾配消失が起こりづらい。

実装

```python

import numpy as np
from common import layers
from collections import OrderedDict
from common import functions
from data.mnist import load_mnist
import matplotlib.pyplot as plt

# mnistをロード
(x_train, d_train), (x_test, d_test) = load_mnist(normalize=True, one_hot_label=True)
train_size = len(x_train)

print("データ読み込み完了")

# 重み初期値補正係数
wieght_init = 0.01
#入力層サイズ
input_layer_size = 784
#中間層サイズ
hidden_layer_1_size = 40
hidden_layer_2_size = 20

#出力層サイズ
output_layer_size = 10
# 繰り返し数
iters_num = 2000
# ミニバッチサイズ
batch_size = 100
# 学習率
learning_rate = 0.1
# 描写頻度
plot_interval=10

# 初期設定
def init_network():
    network = {} 
    network['W1'] = wieght_init * np.random.randn(input_layer_size, hidden_layer_1_size)
    network['W2'] = wieght_init * np.random.randn(hidden_layer_1_size, hidden_layer_2_size)
    network['W3'] = wieght_init * np.random.randn(hidden_layer_2_size, output_layer_size)

    network['b1'] = np.zeros(hidden_layer_1_size)
    network['b2'] = np.zeros(hidden_layer_2_size)
    network['b3'] = np.zeros(output_layer_size)

    return network

# 順伝播
def forward(network, x):
    W1, W2, W3 = network['W1'], network['W2'], network['W3']
    b1, b2, b3 = network['b1'], network['b2'], network['b3']
    hidden_f = functions.sigmoid
    
    u1 =  np.dot(x, W1) + b1
    z1 = hidden_f(u1)
    u2 =  np.dot(z1, W2) + b2
    z2 = hidden_f(u2)
    u3 =  np.dot(z2, W3) + b3
    y = functions.softmax(u3)
 
    return z1, z2, y

# 誤差逆伝播
def backward(x, d, z1, z2, y):
    grad = {}
    
    W1, W2, W3 = network['W1'], network['W2'], network['W3']
    b1, b2, b3 = network['b1'], network['b2'], network['b3']
    hidden_d_f = functions.d_sigmoid
    last_d_f = functions.d_softmax_with_loss
    
    
    # 出力層でのデルタ
    delta3 = last_d_f(d, y)
    # b3の勾配
    grad['b3'] = np.sum(delta3, axis=0)
    # W3の勾配
    grad['W3'] = np.dot(z2.T, delta3)
    # 2層でのデルタ
    delta2 = np.dot(delta3, W3.T) * hidden_d_f(z2)
    # b2の勾配
    grad['b2'] = np.sum(delta2, axis=0)
    # W2の勾配
    grad['W2'] = np.dot(z1.T, delta2)
    # 1層でのデルタ
    delta1 = np.dot(delta2, W2.T) * hidden_d_f(z1)
    # b1の勾配
    grad['b1'] = np.sum(delta1, axis=0)
    # W1の勾配
    grad['W1'] = np.dot(x.T, delta1)

    return grad

# パラメータの初期化
network = init_network()

accuracies_train = []
accuracies_test = []

# 正答率
def accuracy(x, d):
    z1, z2, y = forward(network, x)
    y = np.argmax(y, axis=1)
    if d.ndim != 1 : d = np.argmax(d, axis=1)
    accuracy = np.sum(y == d) / float(x.shape[0])
    return accuracy

for i in range(iters_num):
    # ランダムにバッチを取得    
    batch_mask = np.random.choice(train_size, batch_size)
    # ミニバッチに対応する教師訓練画像データを取得    
    x_batch = x_train[batch_mask]
    # ミニバッチに対応する訓練正解ラベルデータを取得する
    d_batch = d_train[batch_mask]


    
    z1, z2, y = forward(network, x_batch)
    grad = backward(x_batch, d_batch, z1, z2, y)

    if (i+1)%plot_interval==0:
        accr_test = accuracy(x_test, d_test)
        accuracies_test.append(accr_test)
        
        accr_train = accuracy(x_batch, d_batch)
        accuracies_train.append(accr_train)

        print('Generation: ' + str(i+1) + '. 正答率(トレーニング) = ' + str(accr_train))
        print('                : ' + str(i+1) + '. 正答率(テスト) = ' + str(accr_test))

    # パラメータに勾配適用
    for key in ('W1', 'W2', 'W3', 'b1', 'b2', 'b3'):
        network[key]  -= learning_rate * grad[key]


lists = range(0, iters_num, plot_interval)
plt.plot(lists, accuracies_train, label="training set")
plt.plot(lists, accuracies_test,  label="test set")
plt.legend(loc="lower right")
plt.title("accuracy")
plt.xlabel("count")
plt.ylabel("accuracy")
plt.ylim(0, 1.0)
# グラフの表示
plt.show()
```
>データ読み込み完了
Generation: 10. 正答率(トレーニング) = 0.2
                : 10. 正答率(テスト) = 0.101
Generation: 20. 正答率(トレーニング) = 0.1
                : 20. 正答率(テスト) = 0.0974
Generation: 30. 正答率(トレーニング) = 0.12
                : 30. 正答率(テスト) = 0.0974
Generation: 40. 正答率(トレーニング) = 0.12
                : 40. 正答率(テスト) = 0.1135
Generation: 50. 正答率(トレーニング) = 0.1
                : 50. 正答率(テスト) = 0.1135
Generation: 60. 正答率(トレーニング) = 0.16
                : 60. 正答率(テスト) = 0.1135
Generation: 70. 正答率(トレーニング) = 0.11
                : 70. 正答率(テスト) = 0.1135
Generation: 80. 正答率(トレーニング) = 0.08
                : 80. 正答率(テスト) = 0.1135
Generation: 90. 正答率(トレーニング) = 0.11
                : 90. 正答率(テスト) = 0.0974
Generation: 100. 正答率(トレーニング) = 0.06
                : 100. 正答率(テスト) = 0.0958
Generation: 110. 正答率(トレーニング) = 0.14
                : 110. 正答率(テスト) = 0.1135
Generation: 120. 正答率(トレーニング) = 0.07
                : 120. 正答率(テスト) = 0.1135
Generation: 130. 正答率(トレーニング) = 0.1
                : 130. 正答率(テスト) = 0.1135
Generation: 140. 正答率(トレーニング) = 0.12
                : 140. 正答率(テスト) = 0.1135
Generation: 150. 正答率(トレーニング) = 0.14
                : 150. 正答率(テスト) = 0.1135
Generation: 160. 正答率(トレーニング) = 0.14
                : 160. 正答率(テスト) = 0.1135
Generation: 170. 正答率(トレーニング) = 0.06
                : 170. 正答率(テスト) = 0.1135
Generation: 180. 正答率(トレーニング) = 0.12
                : 180. 正答率(テスト) = 0.1135
Generation: 190. 正答率(トレーニング) = 0.1
                : 190. 正答率(テスト) = 0.1135
Generation: 200. 正答率(トレーニング) = 0.12
                : 200. 正答率(テスト) = 0.1135
Generation: 210. 正答率(トレーニング) = 0.03
                : 210. 正答率(テスト) = 0.1135
Generation: 220. 正答率(トレーニング) = 0.14
                : 220. 正答率(テスト) = 0.1135
Generation: 230. 正答率(トレーニング) = 0.1
                : 230. 正答率(テスト) = 0.1135
Generation: 240. 正答率(トレーニング) = 0.13
                : 240. 正答率(テスト) = 0.1135
Generation: 250. 正答率(トレーニング) = 0.15
                : 250. 正答率(テスト) = 0.1135
Generation: 260. 正答率(トレーニング) = 0.11
                : 260. 正答率(テスト) = 0.1135
Generation: 270. 正答率(トレーニング) = 0.2
                : 270. 正答率(テスト) = 0.1135
Generation: 280. 正答率(トレーニング) = 0.12
                : 280. 正答率(テスト) = 0.1135
Generation: 290. 正答率(トレーニング) = 0.15
                : 290. 正答率(テスト) = 0.1135
Generation: 300. 正答率(トレーニング) = 0.18
                : 300. 正答率(テスト) = 0.1135
Generation: 310. 正答率(トレーニング) = 0.08
                : 310. 正答率(テスト) = 0.1135
Generation: 320. 正答率(トレーニング) = 0.11
                : 320. 正答率(テスト) = 0.1135
Generation: 330. 正答率(トレーニング) = 0.18
                : 330. 正答率(テスト) = 0.1135
Generation: 340. 正答率(トレーニング) = 0.11
                : 340. 正答率(テスト) = 0.1135
Generation: 350. 正答率(トレーニング) = 0.07
                : 350. 正答率(テスト) = 0.1135
Generation: 360. 正答率(トレーニング) = 0.11
                : 360. 正答率(テスト) = 0.1135
Generation: 370. 正答率(トレーニング) = 0.11
                : 370. 正答率(テスト) = 0.1135
Generation: 380. 正答率(トレーニング) = 0.11
                : 380. 正答率(テスト) = 0.1135
Generation: 390. 正答率(トレーニング) = 0.11
                : 390. 正答率(テスト) = 0.1135
Generation: 400. 正答率(トレーニング) = 0.15
                : 400. 正答率(テスト) = 0.1135
Generation: 410. 正答率(トレーニング) = 0.08
                : 410. 正答率(テスト) = 0.1135
Generation: 420. 正答率(トレーニング) = 0.11
                : 420. 正答率(テスト) = 0.1135
Generation: 430. 正答率(トレーニング) = 0.1
                : 430. 正答率(テスト) = 0.1135
Generation: 440. 正答率(トレーニング) = 0.15
                : 440. 正答率(テスト) = 0.1135
Generation: 450. 正答率(トレーニング) = 0.08
                : 450. 正答率(テスト) = 0.1135
Generation: 460. 正答率(トレーニング) = 0.12
                : 460. 正答率(テスト) = 0.1135
Generation: 470. 正答率(トレーニング) = 0.08
                : 470. 正答率(テスト) = 0.1135
Generation: 480. 正答率(トレーニング) = 0.07
                : 480. 正答率(テスト) = 0.1135
Generation: 490. 正答率(トレーニング) = 0.13
                : 490. 正答率(テスト) = 0.1135
Generation: 500. 正答率(トレーニング) = 0.1
                : 500. 正答率(テスト) = 0.1135
Generation: 510. 正答率(トレーニング) = 0.1
                : 510. 正答率(テスト) = 0.1135
Generation: 520. 正答率(トレーニング) = 0.13
                : 520. 正答率(テスト) = 0.1135
Generation: 530. 正答率(トレーニング) = 0.13
                : 530. 正答率(テスト) = 0.098
Generation: 540. 正答率(トレーニング) = 0.15
                : 540. 正答率(テスト) = 0.1135
Generation: 550. 正答率(トレーニング) = 0.09
                : 550. 正答率(テスト) = 0.1135
Generation: 560. 正答率(トレーニング) = 0.11
                : 560. 正答率(テスト) = 0.098
Generation: 570. 正答率(トレーニング) = 0.18
                : 570. 正答率(テスト) = 0.1009
Generation: 580. 正答率(トレーニング) = 0.11
                : 580. 正答率(テスト) = 0.1135
Generation: 590. 正答率(トレーニング) = 0.06
                : 590. 正答率(テスト) = 0.1135
Generation: 600. 正答率(トレーニング) = 0.16
                : 600. 正答率(テスト) = 0.1009
Generation: 610. 正答率(トレーニング) = 0.12
                : 610. 正答率(テスト) = 0.1135
Generation: 620. 正答率(トレーニング) = 0.09
                : 620. 正答率(テスト) = 0.1135
Generation: 630. 正答率(トレーニング) = 0.15
                : 630. 正答率(テスト) = 0.1135
Generation: 640. 正答率(トレーニング) = 0.16
                : 640. 正答率(テスト) = 0.1135
Generation: 650. 正答率(トレーニング) = 0.16
                : 650. 正答率(テスト) = 0.1135
Generation: 660. 正答率(トレーニング) = 0.16
                : 660. 正答率(テスト) = 0.1135
Generation: 670. 正答率(トレーニング) = 0.12
                : 670. 正答率(テスト) = 0.1135
Generation: 680. 正答率(トレーニング) = 0.09
                : 680. 正答率(テスト) = 0.0974
Generation: 690. 正答率(トレーニング) = 0.1
                : 690. 正答率(テスト) = 0.1135
Generation: 700. 正答率(トレーニング) = 0.05
                : 700. 正答率(テスト) = 0.0958
Generation: 710. 正答率(トレーニング) = 0.09
                : 710. 正答率(テスト) = 0.1135
Generation: 720. 正答率(トレーニング) = 0.1
                : 720. 正答率(テスト) = 0.101
Generation: 730. 正答率(トレーニング) = 0.1
                : 730. 正答率(テスト) = 0.1135
Generation: 740. 正答率(トレーニング) = 0.12
                : 740. 正答率(テスト) = 0.1135
Generation: 750. 正答率(トレーニング) = 0.16
                : 750. 正答率(テスト) = 0.1135
Generation: 760. 正答率(トレーニング) = 0.15
                : 760. 正答率(テスト) = 0.1135
Generation: 770. 正答率(トレーニング) = 0.11
                : 770. 正答率(テスト) = 0.1135
Generation: 780. 正答率(トレーニング) = 0.1
                : 780. 正答率(テスト) = 0.1135
Generation: 790. 正答率(トレーニング) = 0.15
                : 790. 正答率(テスト) = 0.101
Generation: 800. 正答率(トレーニング) = 0.11
                : 800. 正答率(テスト) = 0.101
Generation: 810. 正答率(トレーニング) = 0.11
                : 810. 正答率(テスト) = 0.0982
Generation: 820. 正答率(トレーニング) = 0.09
                : 820. 正答率(テスト) = 0.1135
Generation: 830. 正答率(トレーニング) = 0.14
                : 830. 正答率(テスト) = 0.1135
Generation: 840. 正答率(トレーニング) = 0.12
                : 840. 正答率(テスト) = 0.1135
Generation: 850. 正答率(トレーニング) = 0.1
                : 850. 正答率(テスト) = 0.1135
Generation: 860. 正答率(トレーニング) = 0.1
                : 860. 正答率(テスト) = 0.1135
Generation: 870. 正答率(トレーニング) = 0.07
                : 870. 正答率(テスト) = 0.1135
Generation: 880. 正答率(トレーニング) = 0.11
                : 880. 正答率(テスト) = 0.101
Generation: 890. 正答率(トレーニング) = 0.11
                : 890. 正答率(テスト) = 0.101
Generation: 900. 正答率(トレーニング) = 0.12
                : 900. 正答率(テスト) = 0.1135
Generation: 910. 正答率(トレーニング) = 0.09
                : 910. 正答率(テスト) = 0.1135
Generation: 920. 正答率(トレーニング) = 0.09
                : 920. 正答率(テスト) = 0.1135
Generation: 930. 正答率(トレーニング) = 0.08
                : 930. 正答率(テスト) = 0.1135
Generation: 940. 正答率(トレーニング) = 0.1
                : 940. 正答率(テスト) = 0.1009
Generation: 950. 正答率(トレーニング) = 0.09
                : 950. 正答率(テスト) = 0.0982
Generation: 960. 正答率(トレーニング) = 0.12
                : 960. 正答率(テスト) = 0.0958
Generation: 970. 正答率(トレーニング) = 0.09
                : 970. 正答率(テスト) = 0.1135
Generation: 980. 正答率(トレーニング) = 0.1
                : 980. 正答率(テスト) = 0.1028
Generation: 990. 正答率(トレーニング) = 0.13
                : 990. 正答率(テスト) = 0.1135
Generation: 1000. 正答率(トレーニング) = 0.21
                : 1000. 正答率(テスト) = 0.1135
Generation: 1010. 正答率(トレーニング) = 0.09
                : 1010. 正答率(テスト) = 0.1135
Generation: 1020. 正答率(トレーニング) = 0.13
                : 1020. 正答率(テスト) = 0.101
Generation: 1030. 正答率(トレーニング) = 0.06
                : 1030. 正答率(テスト) = 0.1135
Generation: 1040. 正答率(トレーニング) = 0.14
                : 1040. 正答率(テスト) = 0.1135
Generation: 1050. 正答率(トレーニング) = 0.09
                : 1050. 正答率(テスト) = 0.1135
Generation: 1060. 正答率(トレーニング) = 0.1
                : 1060. 正答率(テスト) = 0.1135
Generation: 1070. 正答率(トレーニング) = 0.1
                : 1070. 正答率(テスト) = 0.1135
Generation: 1080. 正答率(トレーニング) = 0.12
                : 1080. 正答率(テスト) = 0.1135
Generation: 1090. 正答率(トレーニング) = 0.07
                : 1090. 正答率(テスト) = 0.1135
Generation: 1100. 正答率(トレーニング) = 0.15
                : 1100. 正答率(テスト) = 0.1135
Generation: 1110. 正答率(トレーニング) = 0.12
                : 1110. 正答率(テスト) = 0.1135
Generation: 1120. 正答率(トレーニング) = 0.11
                : 1120. 正答率(テスト) = 0.1135
Generation: 1130. 正答率(トレーニング) = 0.08
                : 1130. 正答率(テスト) = 0.1135
Generation: 1140. 正答率(トレーニング) = 0.09
                : 1140. 正答率(テスト) = 0.1028
Generation: 1150. 正答率(トレーニング) = 0.07
                : 1150. 正答率(テスト) = 0.1135
Generation: 1160. 正答率(トレーニング) = 0.11
                : 1160. 正答率(テスト) = 0.1028
Generation: 1170. 正答率(トレーニング) = 0.12
                : 1170. 正答率(テスト) = 0.1135
Generation: 1180. 正答率(トレーニング) = 0.05
                : 1180. 正答率(テスト) = 0.1135
Generation: 1190. 正答率(トレーニング) = 0.09
                : 1190. 正答率(テスト) = 0.1135
Generation: 1200. 正答率(トレーニング) = 0.06
                : 1200. 正答率(テスト) = 0.1135
Generation: 1210. 正答率(トレーニング) = 0.14
                : 1210. 正答率(テスト) = 0.1028
Generation: 1220. 正答率(トレーニング) = 0.23
                : 1220. 正答率(テスト) = 0.1135
Generation: 1230. 正答率(トレーニング) = 0.11
                : 1230. 正答率(テスト) = 0.1135
Generation: 1240. 正答率(トレーニング) = 0.12
                : 1240. 正答率(テスト) = 0.1135
Generation: 1250. 正答率(トレーニング) = 0.06
                : 1250. 正答率(テスト) = 0.1135
Generation: 1260. 正答率(トレーニング) = 0.07
                : 1260. 正答率(テスト) = 0.1032
Generation: 1270. 正答率(トレーニング) = 0.12
                : 1270. 正答率(テスト) = 0.1135
Generation: 1280. 正答率(トレーニング) = 0.18
                : 1280. 正答率(テスト) = 0.1135
Generation: 1290. 正答率(トレーニング) = 0.14
                : 1290. 正答率(テスト) = 0.1135
Generation: 1300. 正答率(トレーニング) = 0.11
                : 1300. 正答率(テスト) = 0.1135
Generation: 1310. 正答率(トレーニング) = 0.08
                : 1310. 正答率(テスト) = 0.1135
Generation: 1320. 正答率(トレーニング) = 0.14
                : 1320. 正答率(テスト) = 0.1028
Generation: 1330. 正答率(トレーニング) = 0.05
                : 1330. 正答率(テスト) = 0.1135
Generation: 1340. 正答率(トレーニング) = 0.15
                : 1340. 正答率(テスト) = 0.1135
Generation: 1350. 正答率(トレーニング) = 0.13
                : 1350. 正答率(テスト) = 0.1135
Generation: 1360. 正答率(トレーニング) = 0.13
                : 1360. 正答率(テスト) = 0.1135
Generation: 1370. 正答率(トレーニング) = 0.11
                : 1370. 正答率(テスト) = 0.1135
Generation: 1380. 正答率(トレーニング) = 0.16
                : 1380. 正答率(テスト) = 0.1135
Generation: 1390. 正答率(トレーニング) = 0.1
                : 1390. 正答率(テスト) = 0.1135
Generation: 1400. 正答率(トレーニング) = 0.13
                : 1400. 正答率(テスト) = 0.1135
Generation: 1410. 正答率(トレーニング) = 0.07
                : 1410. 正答率(テスト) = 0.1135
Generation: 1420. 正答率(トレーニング) = 0.14
                : 1420. 正答率(テスト) = 0.1028
Generation: 1430. 正答率(トレーニング) = 0.13
                : 1430. 正答率(テスト) = 0.1028
Generation: 1440. 正答率(トレーニング) = 0.04
                : 1440. 正答率(テスト) = 0.0974
Generation: 1450. 正答率(トレーニング) = 0.14
                : 1450. 正答率(テスト) = 0.0958
Generation: 1460. 正答率(トレーニング) = 0.12
                : 1460. 正答率(テスト) = 0.0958
Generation: 1470. 正答率(トレーニング) = 0.09
                : 1470. 正答率(テスト) = 0.1028
Generation: 1480. 正答率(トレーニング) = 0.12
                : 1480. 正答率(テスト) = 0.1135
Generation: 1490. 正答率(トレーニング) = 0.07
                : 1490. 正答率(テスト) = 0.1135
Generation: 1500. 正答率(トレーニング) = 0.12
                : 1500. 正答率(テスト) = 0.1135
Generation: 1510. 正答率(トレーニング) = 0.16
                : 1510. 正答率(テスト) = 0.1135
Generation: 1520. 正答率(トレーニング) = 0.11
                : 1520. 正答率(テスト) = 0.1135
Generation: 1530. 正答率(トレーニング) = 0.08
                : 1530. 正答率(テスト) = 0.1028
Generation: 1540. 正答率(トレーニング) = 0.12
                : 1540. 正答率(テスト) = 0.101
Generation: 1550. 正答率(トレーニング) = 0.11
                : 1550. 正答率(テスト) = 0.1135
Generation: 1560. 正答率(トレーニング) = 0.17
                : 1560. 正答率(テスト) = 0.1135
Generation: 1570. 正答率(トレーニング) = 0.11
                : 1570. 正答率(テスト) = 0.1135
Generation: 1580. 正答率(トレーニング) = 0.17
                : 1580. 正答率(テスト) = 0.1135
Generation: 1590. 正答率(トレーニング) = 0.07
                : 1590. 正答率(テスト) = 0.1135
Generation: 1600. 正答率(トレーニング) = 0.1
                : 1600. 正答率(テスト) = 0.101
Generation: 1610. 正答率(トレーニング) = 0.13
                : 1610. 正答率(テスト) = 0.1028
Generation: 1620. 正答率(トレーニング) = 0.14
                : 1620. 正答率(テスト) = 0.1028
Generation: 1630. 正答率(トレーニング) = 0.08
                : 1630. 正答率(テスト) = 0.1135
Generation: 1640. 正答率(トレーニング) = 0.12
                : 1640. 正答率(テスト) = 0.1028
Generation: 1650. 正答率(トレーニング) = 0.11
                : 1650. 正答率(テスト) = 0.1028
Generation: 1660. 正答率(トレーニング) = 0.16
                : 1660. 正答率(テスト) = 0.1028
Generation: 1670. 正答率(トレーニング) = 0.11
                : 1670. 正答率(テスト) = 0.0958
Generation: 1680. 正答率(トレーニング) = 0.11
                : 1680. 正答率(テスト) = 0.1135
Generation: 1690. 正答率(トレーニング) = 0.13
                : 1690. 正答率(テスト) = 0.1135
Generation: 1700. 正答率(トレーニング) = 0.11
                : 1700. 正答率(テスト) = 0.1135
Generation: 1710. 正答率(トレーニング) = 0.14
                : 1710. 正答率(テスト) = 0.1135
Generation: 1720. 正答率(トレーニング) = 0.14
                : 1720. 正答率(テスト) = 0.1135
Generation: 1730. 正答率(トレーニング) = 0.09
                : 1730. 正答率(テスト) = 0.1135
Generation: 1740. 正答率(トレーニング) = 0.12
                : 1740. 正答率(テスト) = 0.1135
Generation: 1750. 正答率(トレーニング) = 0.1
                : 1750. 正答率(テスト) = 0.101
Generation: 1760. 正答率(トレーニング) = 0.06
                : 1760. 正答率(テスト) = 0.1009
Generation: 1770. 正答率(トレーニング) = 0.11
                : 1770. 正答率(テスト) = 0.1028
Generation: 1780. 正答率(トレーニング) = 0.11
                : 1780. 正答率(テスト) = 0.1028
Generation: 1790. 正答率(トレーニング) = 0.12
                : 1790. 正答率(テスト) = 0.1028
Generation: 1800. 正答率(トレーニング) = 0.17
                : 1800. 正答率(テスト) = 0.1028
Generation: 1810. 正答率(トレーニング) = 0.13
                : 1810. 正答率(テスト) = 0.1028
Generation: 1820. 正答率(トレーニング) = 0.07
                : 1820. 正答率(テスト) = 0.1028
Generation: 1830. 正答率(トレーニング) = 0.12
                : 1830. 正答率(テスト) = 0.1135
Generation: 1840. 正答率(トレーニング) = 0.12
                : 1840. 正答率(テスト) = 0.1135
Generation: 1850. 正答率(トレーニング) = 0.14
                : 1850. 正答率(テスト) = 0.1135
Generation: 1860. 正答率(トレーニング) = 0.09
                : 1860. 正答率(テスト) = 0.1135
Generation: 1870. 正答率(トレーニング) = 0.11
                : 1870. 正答率(テスト) = 0.1135
Generation: 1880. 正答率(トレーニング) = 0.14
                : 1880. 正答率(テスト) = 0.0958
Generation: 1890. 正答率(トレーニング) = 0.05
                : 1890. 正答率(テスト) = 0.1028
Generation: 1900. 正答率(トレーニング) = 0.08
                : 1900. 正答率(テスト) = 0.1135
Generation: 1910. 正答率(トレーニング) = 0.11
                : 1910. 正答率(テスト) = 0.0974
Generation: 1920. 正答率(トレーニング) = 0.11
                : 1920. 正答率(テスト) = 0.098
Generation: 1930. 正答率(トレーニング) = 0.11
                : 1930. 正答率(テスト) = 0.1032
Generation: 1940. 正答率(トレーニング) = 0.14
                : 1940. 正答率(テスト) = 0.1135
Generation: 1950. 正答率(トレーニング) = 0.12
                : 1950. 正答率(テスト) = 0.1135
Generation: 1960. 正答率(トレーニング) = 0.09
                : 1960. 正答率(テスト) = 0.1135
Generation: 1970. 正答率(トレーニング) = 0.09
                : 1970. 正答率(テスト) = 0.1135
Generation: 1980. 正答率(トレーニング) = 0.12
                : 1980. 正答率(テスト) = 0.1135
Generation: 1990. 正答率(トレーニング) = 0.05
                : 1990. 正答率(テスト) = 0.101
Generation: 2000. 正答率(トレーニング) = 0.18
                : 2000. 正答率(テスト) = 0.1135

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1043122/552a1f73-785f-3ea4-71b7-2f7e631903c3.png)


勾配が消失している。
続いてReLU関数を使用する。


```python
import numpy as np
from data.mnist import load_mnist
from PIL import Image
import pickle
from common import functions
import matplotlib.pyplot as plt

# mnistをロード
(x_train, d_train), (x_test, d_test) = load_mnist(normalize=True, one_hot_label=True)
train_size = len(x_train)

print("データ読み込み完了")

# 重み初期値補正係数
wieght_init = 0.01
#入力層サイズ
input_layer_size = 784
#中間層サイズ
hidden_layer_1_size = 40
hidden_layer_2_size = 20

#出力層サイズ
output_layer_size = 10
# 繰り返し数
iters_num = 2000
# ミニバッチサイズ
batch_size = 100
# 学習率
learning_rate = 0.1
# 描写頻度
plot_interval=10

# 初期設定
def init_network():
    network = {} 

    network['W1'] = wieght_init * np.random.randn(input_layer_size, hidden_layer_1_size)
    network['W2'] = wieght_init * np.random.randn(hidden_layer_1_size, hidden_layer_2_size)
    network['W3'] = wieght_init * np.random.randn(hidden_layer_2_size, output_layer_size)
            
    network['b1'] = np.zeros(hidden_layer_1_size)
    network['b2'] = np.zeros(hidden_layer_2_size)
    network['b3'] = np.zeros(output_layer_size)

    return network

# 順伝播
def forward(network, x):
    W1, W2, W3 = network['W1'], network['W2'], network['W3']
    b1, b2, b3 = network['b1'], network['b2'], network['b3']
    
    ###########  変更箇所  ##############

    hidden_f = functions.relu

    #################################
    
    u1 =  np.dot(x, W1) + b1
    z1 = hidden_f(u1)
    u2 =  np.dot(z1, W2) + b2
    z2 = hidden_f(u2)
    u3 =  np.dot(z2, W3) + b3
    y = functions.softmax(u3)
 
    return z1, z2, y

# 誤差逆伝播
def backward(x, d, z1, z2, y):
    grad = {}
    
    W1, W2, W3 = network['W1'], network['W2'], network['W3']
    b1, b2, b3 = network['b1'], network['b2'], network['b3']

    ###########  変更箇所  ##############
    
    hidden_d_f = functions.d_relu
    
    #################################
    
    
    # 出力層でのデルタ
    delta3 = functions.d_softmax_with_loss(d, y)
    # b3の勾配
    grad['b3'] = np.sum(delta3, axis=0)
    # W3の勾配
    grad['W3'] = np.dot(z2.T, delta3)
    # 2層でのデルタ
    delta2 = np.dot(delta3, W3.T) * hidden_d_f(z2)
    # b2の勾配
    grad['b2'] = np.sum(delta2, axis=0)
    # W2の勾配
    grad['W2'] = np.dot(z1.T, delta2)
    # 1層でのデルタ
    delta1 = np.dot(delta2, W2.T) * hidden_d_f(z1)
    # b1の勾配
    grad['b1'] = np.sum(delta1, axis=0)
    # W1の勾配
    grad['W1'] = np.dot(x.T, delta1)

    return grad

# パラメータの初期化
network = init_network()

accuracies_train = []
accuracies_test = []

# 正答率
def accuracy(x, d):
    z1, z2, y = forward(network, x)
    y = np.argmax(y, axis=1)
    if d.ndim != 1 : d = np.argmax(d, axis=1)
    accuracy = np.sum(y == d) / float(x.shape[0])
    return accuracy

for i in range(iters_num):
    # ランダムにバッチを取得    
    batch_mask = np.random.choice(train_size, batch_size)
    # ミニバッチに対応する教師訓練画像データを取得    
    x_batch = x_train[batch_mask]
    # ミニバッチに対応する訓練正解ラベルデータを取得する
    d_batch = d_train[batch_mask]


    
    z1, z2, y = forward(network, x_batch)
    grad = backward(x_batch, d_batch, z1, z2, y)

    if (i+1)%plot_interval==0:
        accr_test = accuracy(x_test, d_test)
        accuracies_test.append(accr_test)
        
        accr_train = accuracy(x_batch, d_batch)
        accuracies_train.append(accr_train)

        print('Generation: ' + str(i+1) + '. 正答率(トレーニング) = ' + str(accr_train))
        print('                : ' + str(i+1) + '. 正答率(テスト) = ' + str(accr_test))
        
    # パラメータに勾配適用
    for key in ('W1', 'W2', 'W3', 'b1', 'b2', 'b3'):
        network[key]  -= learning_rate * grad[key]


lists = range(0, iters_num, plot_interval)
plt.plot(lists, accuracies_train, label="training set")
plt.plot(lists, accuracies_test,  label="test set")
plt.legend(loc="lower right")
plt.title("accuracy")
plt.xlabel("count")
plt.ylabel("accuracy")
plt.ylim(0, 1.0)
# グラフの表示
plt.show()

```

>データ読み込み完了
Generation: 10. 正答率(トレーニング) = 0.07
                : 10. 正答率(テスト) = 0.0982
Generation: 20. 正答率(トレーニング) = 0.16
                : 20. 正答率(テスト) = 0.0982
Generation: 30. 正答率(トレーニング) = 0.07
                : 30. 正答率(テスト) = 0.0982
Generation: 40. 正答率(トレーニング) = 0.12
                : 40. 正答率(テスト) = 0.1028
Generation: 50. 正答率(トレーニング) = 0.08
                : 50. 正答率(テスト) = 0.1028
Generation: 60. 正答率(トレーニング) = 0.08
                : 60. 正答率(テスト) = 0.1028
Generation: 70. 正答率(トレーニング) = 0.06
                : 70. 正答率(テスト) = 0.1028
Generation: 80. 正答率(トレーニング) = 0.12
                : 80. 正答率(テスト) = 0.1135
Generation: 90. 正答率(トレーニング) = 0.07
                : 90. 正答率(テスト) = 0.1135
Generation: 100. 正答率(トレーニング) = 0.1
                : 100. 正答率(テスト) = 0.1135
Generation: 110. 正答率(トレーニング) = 0.06
                : 110. 正答率(テスト) = 0.1135
Generation: 120. 正答率(トレーニング) = 0.09
                : 120. 正答率(テスト) = 0.1135
Generation: 130. 正答率(トレーニング) = 0.07
                : 130. 正答率(テスト) = 0.1135
Generation: 140. 正答率(トレーニング) = 0.15
                : 140. 正答率(テスト) = 0.1135
Generation: 150. 正答率(トレーニング) = 0.16
                : 150. 正答率(テスト) = 0.1135
Generation: 160. 正答率(トレーニング) = 0.11
                : 160. 正答率(テスト) = 0.1135
Generation: 170. 正答率(トレーニング) = 0.09
                : 170. 正答率(テスト) = 0.1135
Generation: 180. 正答率(トレーニング) = 0.13
                : 180. 正答率(テスト) = 0.1135
Generation: 190. 正答率(トレーニング) = 0.12
                : 190. 正答率(テスト) = 0.1135
Generation: 200. 正答率(トレーニング) = 0.18
                : 200. 正答率(テスト) = 0.1135
Generation: 210. 正答率(トレーニング) = 0.08
                : 210. 正答率(テスト) = 0.1135
Generation: 220. 正答率(トレーニング) = 0.11
                : 220. 正答率(テスト) = 0.1135
Generation: 230. 正答率(トレーニング) = 0.12
                : 230. 正答率(テスト) = 0.1135
Generation: 240. 正答率(トレーニング) = 0.09
                : 240. 正答率(テスト) = 0.1135
Generation: 250. 正答率(トレーニング) = 0.13
                : 250. 正答率(テスト) = 0.1135
Generation: 260. 正答率(トレーニング) = 0.09
                : 260. 正答率(テスト) = 0.1135
Generation: 270. 正答率(トレーニング) = 0.13
                : 270. 正答率(テスト) = 0.1135
Generation: 280. 正答率(トレーニング) = 0.16
                : 280. 正答率(テスト) = 0.1135
Generation: 290. 正答率(トレーニング) = 0.17
                : 290. 正答率(テスト) = 0.1135
Generation: 300. 正答率(トレーニング) = 0.06
                : 300. 正答率(テスト) = 0.1135
Generation: 310. 正答率(トレーニング) = 0.1
                : 310. 正答率(テスト) = 0.1135
Generation: 320. 正答率(トレーニング) = 0.13
                : 320. 正答率(テスト) = 0.1135
Generation: 330. 正答率(トレーニング) = 0.05
                : 330. 正答率(テスト) = 0.1135
Generation: 340. 正答率(トレーニング) = 0.04
                : 340. 正答率(テスト) = 0.1135
Generation: 350. 正答率(トレーニング) = 0.16
                : 350. 正答率(テスト) = 0.1135
Generation: 360. 正答率(トレーニング) = 0.12
                : 360. 正答率(テスト) = 0.1135
Generation: 370. 正答率(トレーニング) = 0.13
                : 370. 正答率(テスト) = 0.1135
Generation: 380. 正答率(トレーニング) = 0.12
                : 380. 正答率(テスト) = 0.1135
Generation: 390. 正答率(トレーニング) = 0.09
                : 390. 正答率(テスト) = 0.1135
Generation: 400. 正答率(トレーニング) = 0.15
                : 400. 正答率(テスト) = 0.1135
Generation: 410. 正答率(トレーニング) = 0.07
                : 410. 正答率(テスト) = 0.1136
Generation: 420. 正答率(トレーニング) = 0.17
                : 420. 正答率(テスト) = 0.1387
Generation: 430. 正答率(トレーニング) = 0.09
                : 430. 正答率(テスト) = 0.1135
Generation: 440. 正答率(トレーニング) = 0.08
                : 440. 正答率(テスト) = 0.1136
Generation: 450. 正答率(トレーニング) = 0.12
                : 450. 正答率(テスト) = 0.1216
Generation: 460. 正答率(トレーニング) = 0.17
                : 460. 正答率(テスト) = 0.1825
Generation: 470. 正答率(トレーニング) = 0.28
                : 470. 正答率(テスト) = 0.2417
Generation: 480. 正答率(トレーニング) = 0.34
                : 480. 正答率(テスト) = 0.277
Generation: 490. 正答率(トレーニング) = 0.28
                : 490. 正答率(テスト) = 0.2356
Generation: 500. 正答率(トレーニング) = 0.28
                : 500. 正答率(テスト) = 0.2116
Generation: 510. 正答率(トレーニング) = 0.16
                : 510. 正答率(テスト) = 0.2088
Generation: 520. 正答率(トレーニング) = 0.13
                : 520. 正答率(テスト) = 0.2149
Generation: 530. 正答率(トレーニング) = 0.24
                : 530. 正答率(テスト) = 0.2175
Generation: 540. 正答率(トレーニング) = 0.18
                : 540. 正答率(テスト) = 0.2185
Generation: 550. 正答率(トレーニング) = 0.27
                : 550. 正答率(テスト) = 0.2235
Generation: 560. 正答率(トレーニング) = 0.26
                : 560. 正答率(テスト) = 0.2289
Generation: 570. 正答率(トレーニング) = 0.31
                : 570. 正答率(テスト) = 0.2347
Generation: 580. 正答率(トレーニング) = 0.28
                : 580. 正答率(テスト) = 0.2621
Generation: 590. 正答率(トレーニング) = 0.21
                : 590. 正答率(テスト) = 0.2963
Generation: 600. 正答率(トレーニング) = 0.24
                : 600. 正答率(テスト) = 0.3046
Generation: 610. 正答率(トレーニング) = 0.33
                : 610. 正答率(テスト) = 0.3584
Generation: 620. 正答率(トレーニング) = 0.34
                : 620. 正答率(テスト) = 0.406
Generation: 630. 正答率(トレーニング) = 0.46
                : 630. 正答率(テスト) = 0.4241
Generation: 640. 正答率(トレーニング) = 0.54
                : 640. 正答率(テスト) = 0.4493
Generation: 650. 正答率(トレーニング) = 0.47
                : 650. 正答率(テスト) = 0.525
Generation: 660. 正答率(トレーニング) = 0.48
                : 660. 正答率(テスト) = 0.536
Generation: 670. 正答率(トレーニング) = 0.51
                : 670. 正答率(テスト) = 0.5373
Generation: 680. 正答率(トレーニング) = 0.66
                : 680. 正答率(テスト) = 0.5833
Generation: 690. 正答率(トレーニング) = 0.54
                : 690. 正答率(テスト) = 0.5699
Generation: 700. 正答率(トレーニング) = 0.66
                : 700. 正答率(テスト) = 0.6131
Generation: 710. 正答率(トレーニング) = 0.6
                : 710. 正答率(テスト) = 0.5894
Generation: 720. 正答率(トレーニング) = 0.6
                : 720. 正答率(テスト) = 0.5796
Generation: 730. 正答率(トレーニング) = 0.59
                : 730. 正答率(テスト) = 0.5862
Generation: 740. 正答率(トレーニング) = 0.64
                : 740. 正答率(テスト) = 0.592
Generation: 750. 正答率(トレーニング) = 0.59
                : 750. 正答率(テスト) = 0.574
Generation: 760. 正答率(トレーニング) = 0.63
                : 760. 正答率(テスト) = 0.6348
Generation: 770. 正答率(トレーニング) = 0.55
                : 770. 正答率(テスト) = 0.6674
Generation: 780. 正答率(トレーニング) = 0.64
                : 780. 正答率(テスト) = 0.6443
Generation: 790. 正答率(トレーニング) = 0.66
                : 790. 正答率(テスト) = 0.6423
Generation: 800. 正答率(トレーニング) = 0.6
                : 800. 正答率(テスト) = 0.6466
Generation: 810. 正答率(トレーニング) = 0.63
                : 810. 正答率(テスト) = 0.6486
Generation: 820. 正答率(トレーニング) = 0.64
                : 820. 正答率(テスト) = 0.6679
Generation: 830. 正答率(トレーニング) = 0.65
                : 830. 正答率(テスト) = 0.6863
Generation: 840. 正答率(トレーニング) = 0.7
                : 840. 正答率(テスト) = 0.6746
Generation: 850. 正答率(トレーニング) = 0.64
                : 850. 正答率(テスト) = 0.6704
Generation: 860. 正答率(トレーニング) = 0.66
                : 860. 正答率(テスト) = 0.6774
Generation: 870. 正答率(トレーニング) = 0.66
                : 870. 正答率(テスト) = 0.6634
Generation: 880. 正答率(トレーニング) = 0.69
                : 880. 正答率(テスト) = 0.6869
Generation: 890. 正答率(トレーニング) = 0.71
                : 890. 正答率(テスト) = 0.6602
Generation: 900. 正答率(トレーニング) = 0.77
                : 900. 正答率(テスト) = 0.6889
Generation: 910. 正答率(トレーニング) = 0.76
                : 910. 正答率(テスト) = 0.6538
Generation: 920. 正答率(トレーニング) = 0.71
                : 920. 正答率(テスト) = 0.6998
Generation: 930. 正答率(トレーニング) = 0.76
                : 930. 正答率(テスト) = 0.7237
Generation: 940. 正答率(トレーニング) = 0.67
                : 940. 正答率(テスト) = 0.6825
Generation: 950. 正答率(トレーニング) = 0.64
                : 950. 正答率(テスト) = 0.6597
Generation: 960. 正答率(トレーニング) = 0.81
                : 960. 正答率(テスト) = 0.7671
Generation: 970. 正答率(トレーニング) = 0.77
                : 970. 正答率(テスト) = 0.7687
Generation: 980. 正答率(トレーニング) = 0.82
                : 980. 正答率(テスト) = 0.7508
Generation: 990. 正答率(トレーニング) = 0.83
                : 990. 正答率(テスト) = 0.7797
Generation: 1000. 正答率(トレーニング) = 0.74
                : 1000. 正答率(テスト) = 0.7992
Generation: 1010. 正答率(トレーニング) = 0.76
                : 1010. 正答率(テスト) = 0.7358
Generation: 1020. 正答率(トレーニング) = 0.77
                : 1020. 正答率(テスト) = 0.8064
Generation: 1030. 正答率(トレーニング) = 0.75
                : 1030. 正答率(テスト) = 0.7967
Generation: 1040. 正答率(トレーニング) = 0.84
                : 1040. 正答率(テスト) = 0.8092
Generation: 1050. 正答率(トレーニング) = 0.8
                : 1050. 正答率(テスト) = 0.8198
Generation: 1060. 正答率(トレーニング) = 0.82
                : 1060. 正答率(テスト) = 0.7995
Generation: 1070. 正答率(トレーニング) = 0.8
                : 1070. 正答率(テスト) = 0.841
Generation: 1080. 正答率(トレーニング) = 0.88
                : 1080. 正答率(テスト) = 0.8254
Generation: 1090. 正答率(トレーニング) = 0.84
                : 1090. 正答率(テスト) = 0.8476
Generation: 1100. 正答率(トレーニング) = 0.78
                : 1100. 正答率(テスト) = 0.8437
Generation: 1110. 正答率(トレーニング) = 0.92
                : 1110. 正答率(テスト) = 0.8454
Generation: 1120. 正答率(トレーニング) = 0.74
                : 1120. 正答率(テスト) = 0.8407
Generation: 1130. 正答率(トレーニング) = 0.88
                : 1130. 正答率(テスト) = 0.8536
Generation: 1140. 正答率(トレーニング) = 0.84
                : 1140. 正答率(テスト) = 0.8278
Generation: 1150. 正答率(トレーニング) = 0.77
                : 1150. 正答率(テスト) = 0.8361
Generation: 1160. 正答率(トレーニング) = 0.75
                : 1160. 正答率(テスト) = 0.8137
Generation: 1170. 正答率(トレーニング) = 0.86
                : 1170. 正答率(テスト) = 0.8516
Generation: 1180. 正答率(トレーニング) = 0.84
                : 1180. 正答率(テスト) = 0.8501
Generation: 1190. 正答率(トレーニング) = 0.87
                : 1190. 正答率(テスト) = 0.8613
Generation: 1200. 正答率(トレーニング) = 0.87
                : 1200. 正答率(テスト) = 0.8518
Generation: 1210. 正答率(トレーニング) = 0.87
                : 1210. 正答率(テスト) = 0.8477
Generation: 1220. 正答率(トレーニング) = 0.86
                : 1220. 正答率(テスト) = 0.8654
Generation: 1230. 正答率(トレーニング) = 0.86
                : 1230. 正答率(テスト) = 0.8507
Generation: 1240. 正答率(トレーニング) = 0.82
                : 1240. 正答率(テスト) = 0.8672
Generation: 1250. 正答率(トレーニング) = 0.86
                : 1250. 正答率(テスト) = 0.8623
Generation: 1260. 正答率(トレーニング) = 0.89
                : 1260. 正答率(テスト) = 0.8632
Generation: 1270. 正答率(トレーニング) = 0.91
                : 1270. 正答率(テスト) = 0.8751
Generation: 1280. 正答率(トレーニング) = 0.87
                : 1280. 正答率(テスト) = 0.8609
Generation: 1290. 正答率(トレーニング) = 0.84
                : 1290. 正答率(テスト) = 0.8641
Generation: 1300. 正答率(トレーニング) = 0.89
                : 1300. 正答率(テスト) = 0.8755
Generation: 1310. 正答率(トレーニング) = 0.87
                : 1310. 正答率(テスト) = 0.8747
Generation: 1320. 正答率(トレーニング) = 0.88
                : 1320. 正答率(テスト) = 0.8605
Generation: 1330. 正答率(トレーニング) = 0.91
                : 1330. 正答率(テスト) = 0.8575
Generation: 1340. 正答率(トレーニング) = 0.88
                : 1340. 正答率(テスト) = 0.8773
Generation: 1350. 正答率(トレーニング) = 0.86
                : 1350. 正答率(テスト) = 0.877
Generation: 1360. 正答率(トレーニング) = 0.88
                : 1360. 正答率(テスト) = 0.8783
Generation: 1370. 正答率(トレーニング) = 0.89
                : 1370. 正答率(テスト) = 0.878
Generation: 1380. 正答率(トレーニング) = 0.86
                : 1380. 正答率(テスト) = 0.8765
Generation: 1390. 正答率(トレーニング) = 0.86
                : 1390. 正答率(テスト) = 0.8618
Generation: 1400. 正答率(トレーニング) = 0.9
                : 1400. 正答率(テスト) = 0.8859
Generation: 1410. 正答率(トレーニング) = 0.87
                : 1410. 正答率(テスト) = 0.8822
Generation: 1420. 正答率(トレーニング) = 0.83
                : 1420. 正答率(テスト) = 0.8867
Generation: 1430. 正答率(トレーニング) = 0.87
                : 1430. 正答率(テスト) = 0.8762
Generation: 1440. 正答率(トレーニング) = 0.85
                : 1440. 正答率(テスト) = 0.8879
Generation: 1450. 正答率(トレーニング) = 0.88
                : 1450. 正答率(テスト) = 0.8828
Generation: 1460. 正答率(トレーニング) = 0.93
                : 1460. 正答率(テスト) = 0.8822
Generation: 1470. 正答率(トレーニング) = 0.86
                : 1470. 正答率(テスト) = 0.8777
Generation: 1480. 正答率(トレーニング) = 0.85
                : 1480. 正答率(テスト) = 0.8856
Generation: 1490. 正答率(トレーニング) = 0.87
                : 1490. 正答率(テスト) = 0.8842
Generation: 1500. 正答率(トレーニング) = 0.88
                : 1500. 正答率(テスト) = 0.8815
Generation: 1510. 正答率(トレーニング) = 0.87
                : 1510. 正答率(テスト) = 0.8803
Generation: 1520. 正答率(トレーニング) = 0.89
                : 1520. 正答率(テスト) = 0.8917
Generation: 1530. 正答率(トレーニング) = 0.88
                : 1530. 正答率(テスト) = 0.889
Generation: 1540. 正答率(トレーニング) = 0.89
                : 1540. 正答率(テスト) = 0.8887
Generation: 1550. 正答率(トレーニング) = 0.92
                : 1550. 正答率(テスト) = 0.896
Generation: 1560. 正答率(トレーニング) = 0.9
                : 1560. 正答率(テスト) = 0.8789
Generation: 1570. 正答率(トレーニング) = 0.84
                : 1570. 正答率(テスト) = 0.8881
Generation: 1580. 正答率(トレーニング) = 0.92
                : 1580. 正答率(テスト) = 0.8917
Generation: 1590. 正答率(トレーニング) = 0.89
                : 1590. 正答率(テスト) = 0.8897
Generation: 1600. 正答率(トレーニング) = 0.85
                : 1600. 正答率(テスト) = 0.8847
Generation: 1610. 正答率(トレーニング) = 0.92
                : 1610. 正答率(テスト) = 0.8975
Generation: 1620. 正答率(トレーニング) = 0.87
                : 1620. 正答率(テスト) = 0.8945
Generation: 1630. 正答率(トレーニング) = 0.88
                : 1630. 正答率(テスト) = 0.8962
Generation: 1640. 正答率(トレーニング) = 0.84
                : 1640. 正答率(テスト) = 0.8902
Generation: 1650. 正答率(トレーニング) = 0.87
                : 1650. 正答率(テスト) = 0.8893
Generation: 1660. 正答率(トレーニング) = 0.89
                : 1660. 正答率(テスト) = 0.8923
Generation: 1670. 正答率(トレーニング) = 0.91
                : 1670. 正答率(テスト) = 0.8945
Generation: 1680. 正答率(トレーニング) = 0.89
                : 1680. 正答率(テスト) = 0.8943
Generation: 1690. 正答率(トレーニング) = 0.92
                : 1690. 正答率(テスト) = 0.8969
Generation: 1700. 正答率(トレーニング) = 0.92
                : 1700. 正答率(テスト) = 0.8975
Generation: 1710. 正答率(トレーニング) = 0.92
                : 1710. 正答率(テスト) = 0.889
Generation: 1720. 正答率(トレーニング) = 0.9
                : 1720. 正答率(テスト) = 0.9026
Generation: 1730. 正答率(トレーニング) = 0.89
                : 1730. 正答率(テスト) = 0.9057
Generation: 1740. 正答率(トレーニング) = 0.89
                : 1740. 正答率(テスト) = 0.9023
Generation: 1750. 正答率(トレーニング) = 0.91
                : 1750. 正答率(テスト) = 0.8999
Generation: 1760. 正答率(トレーニング) = 0.92
                : 1760. 正答率(テスト) = 0.8984
Generation: 1770. 正答率(トレーニング) = 0.8
                : 1770. 正答率(テスト) = 0.8955
Generation: 1780. 正答率(トレーニング) = 0.89
                : 1780. 正答率(テスト) = 0.9051
Generation: 1790. 正答率(トレーニング) = 0.9
                : 1790. 正答率(テスト) = 0.9033
Generation: 1800. 正答率(トレーニング) = 0.94
                : 1800. 正答率(テスト) = 0.9026
Generation: 1810. 正答率(トレーニング) = 0.92
                : 1810. 正答率(テスト) = 0.9049
Generation: 1820. 正答率(トレーニング) = 0.94
                : 1820. 正答率(テスト) = 0.9094
Generation: 1830. 正答率(トレーニング) = 0.89
                : 1830. 正答率(テスト) = 0.9085
Generation: 1840. 正答率(トレーニング) = 0.91
                : 1840. 正答率(テスト) = 0.9085
Generation: 1850. 正答率(トレーニング) = 0.91
                : 1850. 正答率(テスト) = 0.9061
Generation: 1860. 正答率(トレーニング) = 0.92
                : 1860. 正答率(テスト) = 0.9061
Generation: 1870. 正答率(トレーニング) = 0.91
                : 1870. 正答率(テスト) = 0.8948
Generation: 1880. 正答率(トレーニング) = 0.91
                : 1880. 正答率(テスト) = 0.9113
Generation: 1890. 正答率(トレーニング) = 0.9
                : 1890. 正答率(テスト) = 0.9089
Generation: 1900. 正答率(トレーニング) = 0.88
                : 1900. 正答率(テスト) = 0.9135
Generation: 1910. 正答率(トレーニング) = 0.89
                : 1910. 正答率(テスト) = 0.8904
Generation: 1920. 正答率(トレーニング) = 0.94
                : 1920. 正答率(テスト) = 0.9155
Generation: 1930. 正答率(トレーニング) = 0.91
                : 1930. 正答率(テスト) = 0.8956
Generation: 1940. 正答率(トレーニング) = 0.89
                : 1940. 正答率(テスト) = 0.8939
Generation: 1950. 正答率(トレーニング) = 0.93
                : 1950. 正答率(テスト) = 0.9063
Generation: 1960. 正答率(トレーニング) = 0.89
                : 1960. 正答率(テスト) = 0.916
Generation: 1970. 正答率(トレーニング) = 0.89
                : 1970. 正答率(テスト) = 0.9175
Generation: 1980. 正答率(トレーニング) = 0.88
                : 1980. 正答率(テスト) = 0.9097
Generation: 1990. 正答率(トレーニング) = 0.92
                : 1990. 正答率(テスト) = 0.9211
Generation: 2000. 正答率(トレーニング) = 0.91
                : 2000. 正答率(テスト) = 0.9146

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1043122/022f6079-4253-ecc9-c43c-dc7ca22e65f1.png)

続いて、初期値設定を変更する。

```python
import numpy as np
from data.mnist import load_mnist
from PIL import Image
import pickle
from common import functions
import matplotlib.pyplot as plt

# mnistをロード
(x_train, d_train), (x_test, d_test) = load_mnist(normalize=True, one_hot_label=True)
train_size = len(x_train)

print("データ読み込み完了")

#入力層サイズ
input_layer_size = 784
#中間層サイズ
hidden_layer_1_size = 40
hidden_layer_2_size = 20
#出力層サイズ
output_layer_size = 10
# 繰り返し数
iters_num = 2000
# ミニバッチサイズ
batch_size = 100
# 学習率
learning_rate = 0.1
# 描写頻度
plot_interval=10

# 初期設定
def init_network():
    network = {} 
    
    ###########  変更箇所  ##############
    
    # Xavierの初期値
    network['W1'] = np.random.randn(input_layer_size, hidden_layer_1_size) / (np.sqrt(input_layer_size))
    network['W2'] = np.random.randn(hidden_layer_1_size, hidden_layer_2_size) / (np.sqrt(hidden_layer_1_size))
    network['W3'] = np.random.randn(hidden_layer_2_size, output_layer_size) / (np.sqrt(hidden_layer_2_size))
    
    #################################
    
    network['b1'] = np.zeros(hidden_layer_1_size)
    network['b2'] = np.zeros(hidden_layer_2_size)
    network['b3'] = np.zeros(output_layer_size)

    return network

# 順伝播
def forward(network, x):
    W1, W2, W3 = network['W1'], network['W2'], network['W3']
    b1, b2, b3 = network['b1'], network['b2'], network['b3']
    hidden_f = functions.sigmoid
    
    u1 =  np.dot(x, W1) + b1
    z1 = hidden_f(u1)
    u2 =  np.dot(z1, W2) + b2
    z2 = hidden_f(u2)
    u3 =  np.dot(z2, W3) + b3
    y = functions.softmax(u3)
 
    return z1, z2, y

# 誤差逆伝播
def backward(x, d, z1, z2, y):
    grad = {}
    
    W1, W2, W3 = network['W1'], network['W2'], network['W3']
    b1, b2, b3 = network['b1'], network['b2'], network['b3']
    hidden_d_f = functions.d_sigmoid
    
    # 出力層でのデルタ
    delta3 = functions.d_softmax_with_loss(d, y)
    # b3の勾配
    grad['b3'] = np.sum(delta3, axis=0)
    # W3の勾配
    grad['W3'] = np.dot(z2.T, delta3)
    # 2層でのデルタ
    delta2 = np.dot(delta3, W3.T) * hidden_d_f(z2)
    # b2の勾配
    grad['b2'] = np.sum(delta2, axis=0)
    # W2の勾配
    grad['W2'] = np.dot(z1.T, delta2)
    # 1層でのデルタ
    delta1 = np.dot(delta2, W2.T) * hidden_d_f(z1)
    # b1の勾配
    grad['b1'] = np.sum(delta1, axis=0)
    # W1の勾配
    grad['W1'] = np.dot(x.T, delta1)

    return grad

# パラメータの初期化
network = init_network()

accuracies_train = []
accuracies_test = []

# 正答率
def accuracy(x, d):
    z1, z2, y = forward(network, x)
    y = np.argmax(y, axis=1)
    if d.ndim != 1 : d = np.argmax(d, axis=1)
    accuracy = np.sum(y == d) / float(x.shape[0])
    return accuracy

for i in range(iters_num):
    # ランダムにバッチを取得    
    batch_mask = np.random.choice(train_size, batch_size)
    # ミニバッチに対応する教師訓練画像データを取得    
    x_batch = x_train[batch_mask]
    # ミニバッチに対応する訓練正解ラベルデータを取得する
    d_batch = d_train[batch_mask]


    
    z1, z2, y = forward(network, x_batch)
    grad = backward(x_batch, d_batch, z1, z2, y)

    if (i+1)%plot_interval==0:
        accr_test = accuracy(x_test, d_test)
        accuracies_test.append(accr_test)
        
        accr_train = accuracy(x_batch, d_batch)
        accuracies_train.append(accr_train)

        print('Generation: ' + str(i+1) + '. 正答率(トレーニング) = ' + str(accr_train))
        print('                : ' + str(i+1) + '. 正答率(テスト) = ' + str(accr_test))
        
    # パラメータに勾配適用
    for key in ('W1', 'W2', 'W3', 'b1', 'b2', 'b3'):
        network[key]  -= learning_rate * grad[key]


lists = range(0, iters_num, plot_interval)
plt.plot(lists, accuracies_train, label="training set")
plt.plot(lists, accuracies_test,  label="test set")
plt.legend(loc="lower right")
plt.title("accuracy")
plt.xlabel("count")
plt.ylabel("accuracy")
plt.ylim(0, 1.0)
# グラフの表示
plt.show()
```

>データ読み込み完了
Generation: 10. 正答率(トレーニング) = 0.14
                : 10. 正答率(テスト) = 0.1009
Generation: 20. 正答率(トレーニング) = 0.14
                : 20. 正答率(テスト) = 0.1029
Generation: 30. 正答率(トレーニング) = 0.13
                : 30. 正答率(テスト) = 0.1534
Generation: 40. 正答率(トレーニング) = 0.12
                : 40. 正答率(テスト) = 0.1661
Generation: 50. 正答率(トレーニング) = 0.11
                : 50. 正答率(テスト) = 0.1402
Generation: 60. 正答率(トレーニング) = 0.22
                : 60. 正答率(テスト) = 0.2127
Generation: 70. 正答率(トレーニング) = 0.18
                : 70. 正答率(テスト) = 0.1835
Generation: 80. 正答率(トレーニング) = 0.27
                : 80. 正答率(テスト) = 0.1987
Generation: 90. 正答率(トレーニング) = 0.2
                : 90. 正答率(テスト) = 0.2111
Generation: 100. 正答率(トレーニング) = 0.12
                : 100. 正答率(テスト) = 0.1949
Generation: 110. 正答率(トレーニング) = 0.22
                : 110. 正答率(テスト) = 0.2479
Generation: 120. 正答率(トレーニング) = 0.24
                : 120. 正答率(テスト) = 0.2951
Generation: 130. 正答率(トレーニング) = 0.16
                : 130. 正答率(テスト) = 0.2527
Generation: 140. 正答率(トレーニング) = 0.23
                : 140. 正答率(テスト) = 0.2811
Generation: 150. 正答率(トレーニング) = 0.27
                : 150. 正答率(テスト) = 0.2913
Generation: 160. 正答率(トレーニング) = 0.36
                : 160. 正答率(テスト) = 0.2778
Generation: 170. 正答率(トレーニング) = 0.29
                : 170. 正答率(テスト) = 0.2225
Generation: 180. 正答率(トレーニング) = 0.32
                : 180. 正答率(テスト) = 0.3432
Generation: 190. 正答率(トレーニング) = 0.26
                : 190. 正答率(テスト) = 0.3218
Generation: 200. 正答率(トレーニング) = 0.36
                : 200. 正答率(テスト) = 0.3585
Generation: 210. 正答率(トレーニング) = 0.39
                : 210. 正答率(テスト) = 0.3442
Generation: 220. 正答率(トレーニング) = 0.38
                : 220. 正答率(テスト) = 0.3578
Generation: 230. 正答率(トレーニング) = 0.39
                : 230. 正答率(テスト) = 0.4283
Generation: 240. 正答率(トレーニング) = 0.41
                : 240. 正答率(テスト) = 0.3431
Generation: 250. 正答率(トレーニング) = 0.46
                : 250. 正答率(テスト) = 0.4191
Generation: 260. 正答率(トレーニング) = 0.51
                : 260. 正答率(テスト) = 0.4755
Generation: 270. 正答率(トレーニング) = 0.38
                : 270. 正答率(テスト) = 0.3562
Generation: 280. 正答率(トレーニング) = 0.42
                : 280. 正答率(テスト) = 0.4264
Generation: 290. 正答率(トレーニング) = 0.42
                : 290. 正答率(テスト) = 0.3963
Generation: 300. 正答率(トレーニング) = 0.47
                : 300. 正答率(テスト) = 0.4113
Generation: 310. 正答率(トレーニング) = 0.39
                : 310. 正答率(テスト) = 0.427
Generation: 320. 正答率(トレーニング) = 0.32
                : 320. 正答率(テスト) = 0.3538
Generation: 330. 正答率(トレーニング) = 0.41
                : 330. 正答率(テスト) = 0.367
Generation: 340. 正答率(トレーニング) = 0.34
                : 340. 正答率(テスト) = 0.3497
Generation: 350. 正答率(トレーニング) = 0.35
                : 350. 正答率(テスト) = 0.3889
Generation: 360. 正答率(トレーニング) = 0.39
                : 360. 正答率(テスト) = 0.3808
Generation: 370. 正答率(トレーニング) = 0.47
                : 370. 正答率(テスト) = 0.4239
Generation: 380. 正答率(トレーニング) = 0.33
                : 380. 正答率(テスト) = 0.4349
Generation: 390. 正答率(トレーニング) = 0.44
                : 390. 正答率(テスト) = 0.4077
Generation: 400. 正答率(トレーニング) = 0.38
                : 400. 正答率(テスト) = 0.3995
Generation: 410. 正答率(トレーニング) = 0.37
                : 410. 正答率(テスト) = 0.4067
Generation: 420. 正答率(トレーニング) = 0.42
                : 420. 正答率(テスト) = 0.4321
Generation: 430. 正答率(トレーニング) = 0.39
                : 430. 正答率(テスト) = 0.4315
Generation: 440. 正答率(トレーニング) = 0.59
                : 440. 正答率(テスト) = 0.4612
Generation: 450. 正答率(トレーニング) = 0.53
                : 450. 正答率(テスト) = 0.4478
Generation: 460. 正答率(トレーニング) = 0.43
                : 460. 正答率(テスト) = 0.459
Generation: 470. 正答率(トレーニング) = 0.35
                : 470. 正答率(テスト) = 0.4766
Generation: 480. 正答率(トレーニング) = 0.49
                : 480. 正答率(テスト) = 0.4659
Generation: 490. 正答率(トレーニング) = 0.44
                : 490. 正答率(テスト) = 0.4454
Generation: 500. 正答率(トレーニング) = 0.51
                : 500. 正答率(テスト) = 0.4695
Generation: 510. 正答率(トレーニング) = 0.52
                : 510. 正答率(テスト) = 0.4675
Generation: 520. 正答率(トレーニング) = 0.44
                : 520. 正答率(テスト) = 0.4778
Generation: 530. 正答率(トレーニング) = 0.48
                : 530. 正答率(テスト) = 0.5101
Generation: 540. 正答率(トレーニング) = 0.52
                : 540. 正答率(テスト) = 0.5068
Generation: 550. 正答率(トレーニング) = 0.54
                : 550. 正答率(テスト) = 0.5086
Generation: 560. 正答率(トレーニング) = 0.59
                : 560. 正答率(テスト) = 0.5258
Generation: 570. 正答率(トレーニング) = 0.53
                : 570. 正答率(テスト) = 0.5282
Generation: 580. 正答率(トレーニング) = 0.49
                : 580. 正答率(テスト) = 0.5157
Generation: 590. 正答率(トレーニング) = 0.46
                : 590. 正答率(テスト) = 0.558
Generation: 600. 正答率(トレーニング) = 0.62
                : 600. 正答率(テスト) = 0.5569
Generation: 610. 正答率(トレーニング) = 0.52
                : 610. 正答率(テスト) = 0.5432
Generation: 620. 正答率(トレーニング) = 0.52
                : 620. 正答率(テスト) = 0.5534
Generation: 630. 正答率(トレーニング) = 0.59
                : 630. 正答率(テスト) = 0.5721
Generation: 640. 正答率(トレーニング) = 0.55
                : 640. 正答率(テスト) = 0.5795
Generation: 650. 正答率(トレーニング) = 0.59
                : 650. 正答率(テスト) = 0.5847
Generation: 660. 正答率(トレーニング) = 0.58
                : 660. 正答率(テスト) = 0.5864
Generation: 670. 正答率(トレーニング) = 0.62
                : 670. 正答率(テスト) = 0.601
Generation: 680. 正答率(トレーニング) = 0.54
                : 680. 正答率(テスト) = 0.5963
Generation: 690. 正答率(トレーニング) = 0.6
                : 690. 正答率(テスト) = 0.6077
Generation: 700. 正答率(トレーニング) = 0.54
                : 700. 正答率(テスト) = 0.607
Generation: 710. 正答率(トレーニング) = 0.59
                : 710. 正答率(テスト) = 0.6128
Generation: 720. 正答率(トレーニング) = 0.63
                : 720. 正答率(テスト) = 0.6097
Generation: 730. 正答率(トレーニング) = 0.65
                : 730. 正答率(テスト) = 0.6006
Generation: 740. 正答率(トレーニング) = 0.68
                : 740. 正答率(テスト) = 0.6232
Generation: 750. 正答率(トレーニング) = 0.46
                : 750. 正答率(テスト) = 0.638
Generation: 760. 正答率(トレーニング) = 0.67
                : 760. 正答率(テスト) = 0.6445
Generation: 770. 正答率(トレーニング) = 0.69
                : 770. 正答率(テスト) = 0.6438
Generation: 780. 正答率(トレーニング) = 0.71
                : 780. 正答率(テスト) = 0.6539
Generation: 790. 正答率(トレーニング) = 0.63
                : 790. 正答率(テスト) = 0.655
Generation: 800. 正答率(トレーニング) = 0.69
                : 800. 正答率(テスト) = 0.6514
Generation: 810. 正答率(トレーニング) = 0.71
                : 810. 正答率(テスト) = 0.6587
Generation: 820. 正答率(トレーニング) = 0.65
                : 820. 正答率(テスト) = 0.6355
Generation: 830. 正答率(トレーニング) = 0.72
                : 830. 正答率(テスト) = 0.6423
Generation: 840. 正答率(トレーニング) = 0.6
                : 840. 正答率(テスト) = 0.6445
Generation: 850. 正答率(トレーニング) = 0.65
                : 850. 正答率(テスト) = 0.646
Generation: 860. 正答率(トレーニング) = 0.61
                : 860. 正答率(テスト) = 0.6542
Generation: 870. 正答率(トレーニング) = 0.53
                : 870. 正答率(テスト) = 0.6555
Generation: 880. 正答率(トレーニング) = 0.67
                : 880. 正答率(テスト) = 0.6676
Generation: 890. 正答率(トレーニング) = 0.64
                : 890. 正答率(テスト) = 0.6674
Generation: 900. 正答率(トレーニング) = 0.66
                : 900. 正答率(テスト) = 0.6547
Generation: 910. 正答率(トレーニング) = 0.66
                : 910. 正答率(テスト) = 0.6668
Generation: 920. 正答率(トレーニング) = 0.69
                : 920. 正答率(テスト) = 0.6782
Generation: 930. 正答率(トレーニング) = 0.59
                : 930. 正答率(テスト) = 0.6788
Generation: 940. 正答率(トレーニング) = 0.68
                : 940. 正答率(テスト) = 0.6805
Generation: 950. 正答率(トレーニング) = 0.77
                : 950. 正答率(テスト) = 0.6927
Generation: 960. 正答率(トレーニング) = 0.76
                : 960. 正答率(テスト) = 0.6889
Generation: 970. 正答率(トレーニング) = 0.72
                : 970. 正答率(テスト) = 0.6969
Generation: 980. 正答率(トレーニング) = 0.72
                : 980. 正答率(テスト) = 0.6908
Generation: 990. 正答率(トレーニング) = 0.67
                : 990. 正答率(テスト) = 0.6916
Generation: 1000. 正答率(トレーニング) = 0.74
                : 1000. 正答率(テスト) = 0.6999
Generation: 1010. 正答率(トレーニング) = 0.63
                : 1010. 正答率(テスト) = 0.7027
Generation: 1020. 正答率(トレーニング) = 0.68
                : 1020. 正答率(テスト) = 0.7
Generation: 1030. 正答率(トレーニング) = 0.66
                : 1030. 正答率(テスト) = 0.7053
Generation: 1040. 正答率(トレーニング) = 0.74
                : 1040. 正答率(テスト) = 0.7039
Generation: 1050. 正答率(トレーニング) = 0.74
                : 1050. 正答率(テスト) = 0.7078
Generation: 1060. 正答率(トレーニング) = 0.71
                : 1060. 正答率(テスト) = 0.7058
Generation: 1070. 正答率(トレーニング) = 0.65
                : 1070. 正答率(テスト) = 0.6979
Generation: 1080. 正答率(トレーニング) = 0.74
                : 1080. 正答率(テスト) = 0.7039
Generation: 1090. 正答率(トレーニング) = 0.65
                : 1090. 正答率(テスト) = 0.7073
Generation: 1100. 正答率(トレーニング) = 0.67
                : 1100. 正答率(テスト) = 0.713
Generation: 1110. 正答率(トレーニング) = 0.77
                : 1110. 正答率(テスト) = 0.7157
Generation: 1120. 正答率(トレーニング) = 0.74
                : 1120. 正答率(テスト) = 0.7131
Generation: 1130. 正答率(トレーニング) = 0.71
                : 1130. 正答率(テスト) = 0.715
Generation: 1140. 正答率(トレーニング) = 0.76
                : 1140. 正答率(テスト) = 0.7187
Generation: 1150. 正答率(トレーニング) = 0.68
                : 1150. 正答率(テスト) = 0.7188
Generation: 1160. 正答率(トレーニング) = 0.65
                : 1160. 正答率(テスト) = 0.7278
Generation: 1170. 正答率(トレーニング) = 0.66
                : 1170. 正答率(テスト) = 0.7253
Generation: 1180. 正答率(トレーニング) = 0.68
                : 1180. 正答率(テスト) = 0.7216
Generation: 1190. 正答率(トレーニング) = 0.74
                : 1190. 正答率(テスト) = 0.7249
Generation: 1200. 正答率(トレーニング) = 0.7
                : 1200. 正答率(テスト) = 0.728
Generation: 1210. 正答率(トレーニング) = 0.68
                : 1210. 正答率(テスト) = 0.7287
Generation: 1220. 正答率(トレーニング) = 0.72
                : 1220. 正答率(テスト) = 0.7284
Generation: 1230. 正答率(トレーニング) = 0.68
                : 1230. 正答率(テスト) = 0.7264
Generation: 1240. 正答率(トレーニング) = 0.74
                : 1240. 正答率(テスト) = 0.73
Generation: 1250. 正答率(トレーニング) = 0.76
                : 1250. 正答率(テスト) = 0.7297
Generation: 1260. 正答率(トレーニング) = 0.7
                : 1260. 正答率(テスト) = 0.7279
Generation: 1270. 正答率(トレーニング) = 0.72
                : 1270. 正答率(テスト) = 0.7344
Generation: 1280. 正答率(トレーニング) = 0.74
                : 1280. 正答率(テスト) = 0.7345
Generation: 1290. 正答率(トレーニング) = 0.76
                : 1290. 正答率(テスト) = 0.7378
Generation: 1300. 正答率(トレーニング) = 0.72
                : 1300. 正答率(テスト) = 0.7316
Generation: 1310. 正答率(トレーニング) = 0.67
                : 1310. 正答率(テスト) = 0.7285
Generation: 1320. 正答率(トレーニング) = 0.69
                : 1320. 正答率(テスト) = 0.7326
Generation: 1330. 正答率(トレーニング) = 0.69
                : 1330. 正答率(テスト) = 0.7357
Generation: 1340. 正答率(トレーニング) = 0.79
                : 1340. 正答率(テスト) = 0.7358
Generation: 1350. 正答率(トレーニング) = 0.73
                : 1350. 正答率(テスト) = 0.7311
Generation: 1360. 正答率(トレーニング) = 0.72
                : 1360. 正答率(テスト) = 0.7335
Generation: 1370. 正答率(トレーニング) = 0.77
                : 1370. 正答率(テスト) = 0.7336
Generation: 1380. 正答率(トレーニング) = 0.78
                : 1380. 正答率(テスト) = 0.7335
Generation: 1390. 正答率(トレーニング) = 0.64
                : 1390. 正答率(テスト) = 0.7339
Generation: 1400. 正答率(トレーニング) = 0.69
                : 1400. 正答率(テスト) = 0.7413
Generation: 1410. 正答率(トレーニング) = 0.71
                : 1410. 正答率(テスト) = 0.7439
Generation: 1420. 正答率(トレーニング) = 0.68
                : 1420. 正答率(テスト) = 0.7435
Generation: 1430. 正答率(トレーニング) = 0.79
                : 1430. 正答率(テスト) = 0.7448
Generation: 1440. 正答率(トレーニング) = 0.7
                : 1440. 正答率(テスト) = 0.7418
Generation: 1450. 正答率(トレーニング) = 0.73
                : 1450. 正答率(テスト) = 0.7418
Generation: 1460. 正答率(トレーニング) = 0.67
                : 1460. 正答率(テスト) = 0.7444
Generation: 1470. 正答率(トレーニング) = 0.75
                : 1470. 正答率(テスト) = 0.7479
Generation: 1480. 正答率(トレーニング) = 0.74
                : 1480. 正答率(テスト) = 0.7488
Generation: 1490. 正答率(トレーニング) = 0.76
                : 1490. 正答率(テスト) = 0.7501
Generation: 1500. 正答率(トレーニング) = 0.72
                : 1500. 正答率(テスト) = 0.7493
Generation: 1510. 正答率(トレーニング) = 0.71
                : 1510. 正答率(テスト) = 0.749
Generation: 1520. 正答率(トレーニング) = 0.71
                : 1520. 正答率(テスト) = 0.7503
Generation: 1530. 正答率(トレーニング) = 0.74
                : 1530. 正答率(テスト) = 0.7497
Generation: 1540. 正答率(トレーニング) = 0.77
                : 1540. 正答率(テスト) = 0.7494
Generation: 1550. 正答率(トレーニング) = 0.73
                : 1550. 正答率(テスト) = 0.7494
Generation: 1560. 正答率(トレーニング) = 0.79
                : 1560. 正答率(テスト) = 0.7533
Generation: 1570. 正答率(トレーニング) = 0.73
                : 1570. 正答率(テスト) = 0.7543
Generation: 1580. 正答率(トレーニング) = 0.75
                : 1580. 正答率(テスト) = 0.7556
Generation: 1590. 正答率(トレーニング) = 0.71
                : 1590. 正答率(テスト) = 0.752
Generation: 1600. 正答率(トレーニング) = 0.74
                : 1600. 正答率(テスト) = 0.7535
Generation: 1610. 正答率(トレーニング) = 0.71
                : 1610. 正答率(テスト) = 0.7559
Generation: 1620. 正答率(トレーニング) = 0.72
                : 1620. 正答率(テスト) = 0.7491
Generation: 1630. 正答率(トレーニング) = 0.82
                : 1630. 正答率(テスト) = 0.7561
Generation: 1640. 正答率(トレーニング) = 0.77
                : 1640. 正答率(テスト) = 0.7569
Generation: 1650. 正答率(トレーニング) = 0.8
                : 1650. 正答率(テスト) = 0.7601
Generation: 1660. 正答率(トレーニング) = 0.74
                : 1660. 正答率(テスト) = 0.7522
Generation: 1670. 正答率(トレーニング) = 0.84
                : 1670. 正答率(テスト) = 0.7594
Generation: 1680. 正答率(トレーニング) = 0.79
                : 1680. 正答率(テスト) = 0.7517
Generation: 1690. 正答率(トレーニング) = 0.72
                : 1690. 正答率(テスト) = 0.7521
Generation: 1700. 正答率(トレーニング) = 0.71
                : 1700. 正答率(テスト) = 0.7609
Generation: 1710. 正答率(トレーニング) = 0.77
                : 1710. 正答率(テスト) = 0.7579
Generation: 1720. 正答率(トレーニング) = 0.75
                : 1720. 正答率(テスト) = 0.7627
Generation: 1730. 正答率(トレーニング) = 0.78
                : 1730. 正答率(テスト) = 0.7647
Generation: 1740. 正答率(トレーニング) = 0.8
                : 1740. 正答率(テスト) = 0.7654
Generation: 1750. 正答率(トレーニング) = 0.68
                : 1750. 正答率(テスト) = 0.7613
Generation: 1760. 正答率(トレーニング) = 0.71
                : 1760. 正答率(テスト) = 0.7678
Generation: 1770. 正答率(トレーニング) = 0.79
                : 1770. 正答率(テスト) = 0.7681
Generation: 1780. 正答率(トレーニング) = 0.8
                : 1780. 正答率(テスト) = 0.7663
Generation: 1790. 正答率(トレーニング) = 0.76
                : 1790. 正答率(テスト) = 0.7638
Generation: 1800. 正答率(トレーニング) = 0.79
                : 1800. 正答率(テスト) = 0.7624
Generation: 1810. 正答率(トレーニング) = 0.72
                : 1810. 正答率(テスト) = 0.7631
Generation: 1820. 正答率(トレーニング) = 0.72
                : 1820. 正答率(テスト) = 0.763
Generation: 1830. 正答率(トレーニング) = 0.8
                : 1830. 正答率(テスト) = 0.7701
Generation: 1840. 正答率(トレーニング) = 0.76
                : 1840. 正答率(テスト) = 0.7693
Generation: 1850. 正答率(トレーニング) = 0.74
                : 1850. 正答率(テスト) = 0.7691
Generation: 1860. 正答率(トレーニング) = 0.8
                : 1860. 正答率(テスト) = 0.7643
Generation: 1870. 正答率(トレーニング) = 0.8
                : 1870. 正答率(テスト) = 0.7686
Generation: 1880. 正答率(トレーニング) = 0.72
                : 1880. 正答率(テスト) = 0.7701
Generation: 1890. 正答率(トレーニング) = 0.67
                : 1890. 正答率(テスト) = 0.7711
Generation: 1900. 正答率(トレーニング) = 0.8
                : 1900. 正答率(テスト) = 0.7715
Generation: 1910. 正答率(トレーニング) = 0.64
                : 1910. 正答率(テスト) = 0.7764
Generation: 1920. 正答率(トレーニング) = 0.76
                : 1920. 正答率(テスト) = 0.7756
Generation: 1930. 正答率(トレーニング) = 0.75
                : 1930. 正答率(テスト) = 0.774
Generation: 1940. 正答率(トレーニング) = 0.77
                : 1940. 正答率(テスト) = 0.774
Generation: 1950. 正答率(トレーニング) = 0.79
                : 1950. 正答率(テスト) = 0.7712
Generation: 1960. 正答率(トレーニング) = 0.73
                : 1960. 正答率(テスト) = 0.774
Generation: 1970. 正答率(トレーニング) = 0.76
                : 1970. 正答率(テスト) = 0.7759
Generation: 1980. 正答率(トレーニング) = 0.73
                : 1980. 正答率(テスト) = 0.7772
Generation: 1990. 正答率(トレーニング) = 0.74
                : 1990. 正答率(テスト) = 0.7777
Generation: 2000. 正答率(トレーニング) = 0.76
                : 2000. 正答率(テスト) = 0.7779

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1043122/090ab57c-bf48-9933-2fb8-b46fc5f2ed50.png)

```python
import numpy as np
from data.mnist import load_mnist
from PIL import Image
import pickle
from common import functions
import matplotlib.pyplot as plt

# mnistをロード
(x_train, d_train), (x_test, d_test) = load_mnist(normalize=True, one_hot_label=True)
train_size = len(x_train)

print("データ読み込み完了")

# 重み初期値補正係数
wieght_init = 0.01
#入力層サイズ
input_layer_size = 784
#中間層サイズ
hidden_layer_1_size = 40
hidden_layer_2_size = 20

#出力層サイズ
output_layer_size = 10
# 繰り返し数
iters_num = 2000
# ミニバッチサイズ
batch_size = 100
# 学習率
learning_rate = 0.1
# 描写頻度
plot_interval=10

# 初期設定
def init_network():
    network = {} 

    ###########  変更箇所  ##############

    # Heの初期値
    network['W1'] = np.random.randn(input_layer_size, hidden_layer_1_size) / np.sqrt(input_layer_size) * np.sqrt(2)
    network['W2'] = np.random.randn(hidden_layer_1_size, hidden_layer_2_size) / np.sqrt(hidden_layer_1_size) * np.sqrt(2)
    network['W3'] = np.random.randn(hidden_layer_2_size, output_layer_size) / np.sqrt(hidden_layer_2_size) * np.sqrt(2)
        
    #################################
    
    network['b1'] = np.zeros(hidden_layer_1_size)
    network['b2'] = np.zeros(hidden_layer_2_size)
    network['b3'] = np.zeros(output_layer_size)

    return network

# 順伝播
def forward(network, x):
    W1, W2, W3 = network['W1'], network['W2'], network['W3']
    b1, b2, b3 = network['b1'], network['b2'], network['b3']

    ###########  変更箇所  ##############
    
    hidden_f = functions.relu
    
    #################################
    
    u1 =  np.dot(x, W1) + b1
    z1 = hidden_f(u1)
    u2 =  np.dot(z1, W2) + b2
    z2 = hidden_f(u2)
    u3 =  np.dot(z2, W3) + b3
    y = functions.softmax(u3)
 
    return z1, z2, y

# 誤差逆伝播
def backward(x, d, z1, z2, y):
    grad = {}
    
    W1, W2, W3 = network['W1'], network['W2'], network['W3']
    b1, b2, b3 = network['b1'], network['b2'], network['b3']
    
    ###########  変更箇所  ##############
    
    hidden_d_f = functions.d_relu
    
    #################################
    
    # 出力層でのデルタ
    delta3 = functions.d_softmax_with_loss(d, y)
    # b3の勾配
    grad['b3'] = np.sum(delta3, axis=0)
    # W3の勾配
    grad['W3'] = np.dot(z2.T, delta3)
    # 2層でのデルタ
    delta2 = np.dot(delta3, W3.T) * hidden_d_f(z2)
    # b2の勾配
    grad['b2'] = np.sum(delta2, axis=0)
    # W2の勾配
    grad['W2'] = np.dot(z1.T, delta2)
    # 1層でのデルタ
    delta1 = np.dot(delta2, W2.T) * hidden_d_f(z1)
    # b1の勾配
    grad['b1'] = np.sum(delta1, axis=0)
    # W1の勾配
    grad['W1'] = np.dot(x.T, delta1)

    return grad

# パラメータの初期化
network = init_network()

accuracies_train = []
accuracies_test = []

# 正答率
def accuracy(x, d):
    z1, z2, y = forward(network, x)
    y = np.argmax(y, axis=1)
    if d.ndim != 1 : d = np.argmax(d, axis=1)
    accuracy = np.sum(y == d) / float(x.shape[0])
    return accuracy

for i in range(iters_num):
    # ランダムにバッチを取得    
    batch_mask = np.random.choice(train_size, batch_size)
    # ミニバッチに対応する教師訓練画像データを取得    
    x_batch = x_train[batch_mask]
    # ミニバッチに対応する訓練正解ラベルデータを取得する
    d_batch = d_train[batch_mask]


    
    z1, z2, y = forward(network, x_batch)
    grad = backward(x_batch, d_batch, z1, z2, y)

    if (i+1)%plot_interval==0:
        accr_test = accuracy(x_test, d_test)
        accuracies_test.append(accr_test)
        
        accr_train = accuracy(x_batch, d_batch)
        accuracies_train.append(accr_train)

        print('Generation: ' + str(i+1) + '. 正答率(トレーニング) = ' + str(accr_train))
        print('                : ' + str(i+1) + '. 正答率(テスト) = ' + str(accr_test))
        
    # パラメータに勾配適用
    for key in ('W1', 'W2', 'W3', 'b1', 'b2', 'b3'):
        network[key]  -= learning_rate * grad[key]


lists = range(0, iters_num, plot_interval)
plt.plot(lists, accuracies_train, label="training set")
plt.plot(lists, accuracies_test,  label="test set")
plt.legend(loc="lower right")
plt.title("accuracy")
plt.xlabel("count")
plt.ylabel("accuracy")
plt.ylim(0, 1.0)
# グラフの表示
plt.show()

```

>データ読み込み完了
Generation: 10. 正答率(トレーニング) = 0.29
                : 10. 正答率(テスト) = 0.2474
Generation: 20. 正答率(トレーニング) = 0.48
                : 20. 正答率(テスト) = 0.4493
Generation: 30. 正答率(トレーニング) = 0.58
                : 30. 正答率(テスト) = 0.5499
Generation: 40. 正答率(トレーニング) = 0.65
                : 40. 正答率(テスト) = 0.6655
Generation: 50. 正答率(トレーニング) = 0.72
                : 50. 正答率(テスト) = 0.7193
Generation: 60. 正答率(トレーニング) = 0.8
                : 60. 正答率(テスト) = 0.7612
Generation: 70. 正答率(トレーニング) = 0.77
                : 70. 正答率(テスト) = 0.824
Generation: 80. 正答率(トレーニング) = 0.72
                : 80. 正答率(テスト) = 0.7873
Generation: 90. 正答率(トレーニング) = 0.82
                : 90. 正答率(テスト) = 0.8498
Generation: 100. 正答率(トレーニング) = 0.81
                : 100. 正答率(テスト) = 0.8357
Generation: 110. 正答率(トレーニング) = 0.85
                : 110. 正答率(テスト) = 0.8567
Generation: 120. 正答率(トレーニング) = 0.87
                : 120. 正答率(テスト) = 0.8486
Generation: 130. 正答率(トレーニング) = 0.93
                : 130. 正答率(テスト) = 0.8648
Generation: 140. 正答率(トレーニング) = 0.87
                : 140. 正答率(テスト) = 0.8759
Generation: 150. 正答率(トレーニング) = 0.84
                : 150. 正答率(テスト) = 0.8781
Generation: 160. 正答率(トレーニング) = 0.88
                : 160. 正答率(テスト) = 0.8875
Generation: 170. 正答率(トレーニング) = 0.9
                : 170. 正答率(テスト) = 0.8884
Generation: 180. 正答率(トレーニング) = 0.88
                : 180. 正答率(テスト) = 0.8918
Generation: 190. 正答率(トレーニング) = 0.9
                : 190. 正答率(テスト) = 0.897
Generation: 200. 正答率(トレーニング) = 0.91
                : 200. 正答率(テスト) = 0.8811
Generation: 210. 正答率(トレーニング) = 0.87
                : 210. 正答率(テスト) = 0.8947
Generation: 220. 正答率(トレーニング) = 0.89
                : 220. 正答率(テスト) = 0.8994
Generation: 230. 正答率(トレーニング) = 0.89
                : 230. 正答率(テスト) = 0.866
Generation: 240. 正答率(トレーニング) = 0.88
                : 240. 正答率(テスト) = 0.8976
Generation: 250. 正答率(トレーニング) = 0.95
                : 250. 正答率(テスト) = 0.8991
Generation: 260. 正答率(トレーニング) = 0.87
                : 260. 正答率(テスト) = 0.9078
Generation: 270. 正答率(トレーニング) = 0.93
                : 270. 正答率(テスト) = 0.9101
Generation: 280. 正答率(トレーニング) = 0.89
                : 280. 正答率(テスト) = 0.8947
Generation: 290. 正答率(トレーニング) = 0.91
                : 290. 正答率(テスト) = 0.9067
Generation: 300. 正答率(トレーニング) = 0.93
                : 300. 正答率(テスト) = 0.9113
Generation: 310. 正答率(トレーニング) = 0.84
                : 310. 正答率(テスト) = 0.9058
Generation: 320. 正答率(トレーニング) = 0.93
                : 320. 正答率(テスト) = 0.9125
Generation: 330. 正答率(トレーニング) = 0.91
                : 330. 正答率(テスト) = 0.9052
Generation: 340. 正答率(トレーニング) = 0.86
                : 340. 正答率(テスト) = 0.9117
Generation: 350. 正答率(トレーニング) = 0.91
                : 350. 正答率(テスト) = 0.913
Generation: 360. 正答率(トレーニング) = 0.92
                : 360. 正答率(テスト) = 0.9154
Generation: 370. 正答率(トレーニング) = 0.94
                : 370. 正答率(テスト) = 0.9144
Generation: 380. 正答率(トレーニング) = 0.89
                : 380. 正答率(テスト) = 0.9187
Generation: 390. 正答率(トレーニング) = 0.82
                : 390. 正答率(テスト) = 0.9197
Generation: 400. 正答率(トレーニング) = 0.84
                : 400. 正答率(テスト) = 0.9098
Generation: 410. 正答率(トレーニング) = 0.92
                : 410. 正答率(テスト) = 0.9177
Generation: 420. 正答率(トレーニング) = 0.86
                : 420. 正答率(テスト) = 0.9087
Generation: 430. 正答率(トレーニング) = 0.91
                : 430. 正答率(テスト) = 0.9157
Generation: 440. 正答率(トレーニング) = 0.88
                : 440. 正答率(テスト) = 0.9153
Generation: 450. 正答率(トレーニング) = 0.94
                : 450. 正答率(テスト) = 0.9138
Generation: 460. 正答率(トレーニング) = 0.92
                : 460. 正答率(テスト) = 0.9194
Generation: 470. 正答率(トレーニング) = 0.91
                : 470. 正答率(テスト) = 0.9212
Generation: 480. 正答率(トレーニング) = 0.94
                : 480. 正答率(テスト) = 0.9204
Generation: 490. 正答率(トレーニング) = 0.9
                : 490. 正答率(テスト) = 0.9157
Generation: 500. 正答率(トレーニング) = 0.96
                : 500. 正答率(テスト) = 0.9217
Generation: 510. 正答率(トレーニング) = 0.93
                : 510. 正答率(テスト) = 0.9239
Generation: 520. 正答率(トレーニング) = 0.93
                : 520. 正答率(テスト) = 0.9238
Generation: 530. 正答率(トレーニング) = 0.93
                : 530. 正答率(テスト) = 0.923
Generation: 540. 正答率(トレーニング) = 0.92
                : 540. 正答率(テスト) = 0.9193
Generation: 550. 正答率(トレーニング) = 0.95
                : 550. 正答率(テスト) = 0.9186
Generation: 560. 正答率(トレーニング) = 0.92
                : 560. 正答率(テスト) = 0.9272
Generation: 570. 正答率(トレーニング) = 0.91
                : 570. 正答率(テスト) = 0.9228
Generation: 580. 正答率(トレーニング) = 0.9
                : 580. 正答率(テスト) = 0.9262
Generation: 590. 正答率(トレーニング) = 0.86
                : 590. 正答率(テスト) = 0.9194
Generation: 600. 正答率(トレーニング) = 0.95
                : 600. 正答率(テスト) = 0.9267
Generation: 610. 正答率(トレーニング) = 0.9
                : 610. 正答率(テスト) = 0.9243
Generation: 620. 正答率(トレーニング) = 0.95
                : 620. 正答率(テスト) = 0.9273
Generation: 630. 正答率(トレーニング) = 0.92
                : 630. 正答率(テスト) = 0.9227
Generation: 640. 正答率(トレーニング) = 0.91
                : 640. 正答率(テスト) = 0.9275
Generation: 650. 正答率(トレーニング) = 0.95
                : 650. 正答率(テスト) = 0.9249
Generation: 660. 正答率(トレーニング) = 0.94
                : 660. 正答率(テスト) = 0.9328
Generation: 670. 正答率(トレーニング) = 0.9
                : 670. 正答率(テスト) = 0.9289
Generation: 680. 正答率(トレーニング) = 0.92
                : 680. 正答率(テスト) = 0.9327
Generation: 690. 正答率(トレーニング) = 0.99
                : 690. 正答率(テスト) = 0.9344
Generation: 700. 正答率(トレーニング) = 0.97
                : 700. 正答率(テスト) = 0.9325
Generation: 710. 正答率(トレーニング) = 0.93
                : 710. 正答率(テスト) = 0.93
Generation: 720. 正答率(トレーニング) = 0.94
                : 720. 正答率(テスト) = 0.9304
Generation: 730. 正答率(トレーニング) = 0.9
                : 730. 正答率(テスト) = 0.9216
Generation: 740. 正答率(トレーニング) = 0.95
                : 740. 正答率(テスト) = 0.9253
Generation: 750. 正答率(トレーニング) = 0.91
                : 750. 正答率(テスト) = 0.9338
Generation: 760. 正答率(トレーニング) = 0.95
                : 760. 正答率(テスト) = 0.931
Generation: 770. 正答率(トレーニング) = 0.87
                : 770. 正答率(テスト) = 0.9254
Generation: 780. 正答率(トレーニング) = 0.92
                : 780. 正答率(テスト) = 0.9218
Generation: 790. 正答率(トレーニング) = 0.99
                : 790. 正答率(テスト) = 0.9368
Generation: 800. 正答率(トレーニング) = 0.94
                : 800. 正答率(テスト) = 0.93
Generation: 810. 正答率(トレーニング) = 0.94
                : 810. 正答率(テスト) = 0.9354
Generation: 820. 正答率(トレーニング) = 0.94
                : 820. 正答率(テスト) = 0.9329
Generation: 830. 正答率(トレーニング) = 0.93
                : 830. 正答率(テスト) = 0.9326
Generation: 840. 正答率(トレーニング) = 0.95
                : 840. 正答率(テスト) = 0.9333
Generation: 850. 正答率(トレーニング) = 0.9
                : 850. 正答率(テスト) = 0.9343
Generation: 860. 正答率(トレーニング) = 0.9
                : 860. 正答率(テスト) = 0.9344
Generation: 870. 正答率(トレーニング) = 0.94
                : 870. 正答率(テスト) = 0.9344
Generation: 880. 正答率(トレーニング) = 0.93
                : 880. 正答率(テスト) = 0.9348
Generation: 890. 正答率(トレーニング) = 0.92
                : 890. 正答率(テスト) = 0.9377
Generation: 900. 正答率(トレーニング) = 0.87
                : 900. 正答率(テスト) = 0.9406
Generation: 910. 正答率(トレーニング) = 0.99
                : 910. 正答率(テスト) = 0.9379
Generation: 920. 正答率(トレーニング) = 0.96
                : 920. 正答率(テスト) = 0.9364
Generation: 930. 正答率(トレーニング) = 1.0
                : 930. 正答率(テスト) = 0.9387
Generation: 940. 正答率(トレーニング) = 0.94
                : 940. 正答率(テスト) = 0.9367
Generation: 950. 正答率(トレーニング) = 0.94
                : 950. 正答率(テスト) = 0.9362
Generation: 960. 正答率(トレーニング) = 0.9
                : 960. 正答率(テスト) = 0.9415
Generation: 970. 正答率(トレーニング) = 0.96
                : 970. 正答率(テスト) = 0.9409
Generation: 980. 正答率(トレーニング) = 0.96
                : 980. 正答率(テスト) = 0.9389
Generation: 990. 正答率(トレーニング) = 0.92
                : 990. 正答率(テスト) = 0.931
Generation: 1000. 正答率(トレーニング) = 0.95
                : 1000. 正答率(テスト) = 0.9369
Generation: 1010. 正答率(トレーニング) = 0.92
                : 1010. 正答率(テスト) = 0.9411
Generation: 1020. 正答率(トレーニング) = 0.92
                : 1020. 正答率(テスト) = 0.9415
Generation: 1030. 正答率(トレーニング) = 0.93
                : 1030. 正答率(テスト) = 0.9396
Generation: 1040. 正答率(トレーニング) = 0.94
                : 1040. 正答率(テスト) = 0.9395
Generation: 1050. 正答率(トレーニング) = 0.92
                : 1050. 正答率(テスト) = 0.9397
Generation: 1060. 正答率(トレーニング) = 0.93
                : 1060. 正答率(テスト) = 0.9375
Generation: 1070. 正答率(トレーニング) = 0.89
                : 1070. 正答率(テスト) = 0.9373
Generation: 1080. 正答率(トレーニング) = 0.95
                : 1080. 正答率(テスト) = 0.9359
Generation: 1090. 正答率(トレーニング) = 0.96
                : 1090. 正答率(テスト) = 0.9414
Generation: 1100. 正答率(トレーニング) = 0.94
                : 1100. 正答率(テスト) = 0.9359
Generation: 1110. 正答率(トレーニング) = 0.96
                : 1110. 正答率(テスト) = 0.9406
Generation: 1120. 正答率(トレーニング) = 0.95
                : 1120. 正答率(テスト) = 0.9363
Generation: 1130. 正答率(トレーニング) = 0.94
                : 1130. 正答率(テスト) = 0.9375
Generation: 1140. 正答率(トレーニング) = 0.94
                : 1140. 正答率(テスト) = 0.9398
Generation: 1150. 正答率(トレーニング) = 0.97
                : 1150. 正答率(テスト) = 0.9368
Generation: 1160. 正答率(トレーニング) = 0.93
                : 1160. 正答率(テスト) = 0.9405
Generation: 1170. 正答率(トレーニング) = 0.95
                : 1170. 正答率(テスト) = 0.9433
Generation: 1180. 正答率(トレーニング) = 0.94
                : 1180. 正答率(テスト) = 0.9357
Generation: 1190. 正答率(トレーニング) = 0.93
                : 1190. 正答率(テスト) = 0.9412
Generation: 1200. 正答率(トレーニング) = 0.95
                : 1200. 正答率(テスト) = 0.943
Generation: 1210. 正答率(トレーニング) = 0.95
                : 1210. 正答率(テスト) = 0.9442
Generation: 1220. 正答率(トレーニング) = 0.97
                : 1220. 正答率(テスト) = 0.9429
Generation: 1230. 正答率(トレーニング) = 0.97
                : 1230. 正答率(テスト) = 0.9441
Generation: 1240. 正答率(トレーニング) = 0.94
                : 1240. 正答率(テスト) = 0.9453
Generation: 1250. 正答率(トレーニング) = 0.94
                : 1250. 正答率(テスト) = 0.9429
Generation: 1260. 正答率(トレーニング) = 0.94
                : 1260. 正答率(テスト) = 0.9445
Generation: 1270. 正答率(トレーニング) = 0.98
                : 1270. 正答率(テスト) = 0.9426
Generation: 1280. 正答率(トレーニング) = 0.95
                : 1280. 正答率(テスト) = 0.9444
Generation: 1290. 正答率(トレーニング) = 0.97
                : 1290. 正答率(テスト) = 0.9457
Generation: 1300. 正答率(トレーニング) = 0.93
                : 1300. 正答率(テスト) = 0.9436
Generation: 1310. 正答率(トレーニング) = 0.97
                : 1310. 正答率(テスト) = 0.9464
Generation: 1320. 正答率(トレーニング) = 0.89
                : 1320. 正答率(テスト) = 0.9458
Generation: 1330. 正答率(トレーニング) = 0.96
                : 1330. 正答率(テスト) = 0.9462
Generation: 1340. 正答率(トレーニング) = 0.96
                : 1340. 正答率(テスト) = 0.9432
Generation: 1350. 正答率(トレーニング) = 0.98
                : 1350. 正答率(テスト) = 0.9435
Generation: 1360. 正答率(トレーニング) = 0.95
                : 1360. 正答率(テスト) = 0.9437
Generation: 1370. 正答率(トレーニング) = 0.95
                : 1370. 正答率(テスト) = 0.9469
Generation: 1380. 正答率(トレーニング) = 0.94
                : 1380. 正答率(テスト) = 0.9484
Generation: 1390. 正答率(トレーニング) = 0.95
                : 1390. 正答率(テスト) = 0.9447
Generation: 1400. 正答率(トレーニング) = 0.94
                : 1400. 正答率(テスト) = 0.9452
Generation: 1410. 正答率(トレーニング) = 0.94
                : 1410. 正答率(テスト) = 0.9458
Generation: 1420. 正答率(トレーニング) = 0.96
                : 1420. 正答率(テスト) = 0.9489
Generation: 1430. 正答率(トレーニング) = 0.94
                : 1430. 正答率(テスト) = 0.948
Generation: 1440. 正答率(トレーニング) = 0.95
                : 1440. 正答率(テスト) = 0.9449
Generation: 1450. 正答率(トレーニング) = 0.96
                : 1450. 正答率(テスト) = 0.9476
Generation: 1460. 正答率(トレーニング) = 0.97
                : 1460. 正答率(テスト) = 0.9463
Generation: 1470. 正答率(トレーニング) = 0.97
                : 1470. 正答率(テスト) = 0.9508
Generation: 1480. 正答率(トレーニング) = 0.93
                : 1480. 正答率(テスト) = 0.9487
Generation: 1490. 正答率(トレーニング) = 0.93
                : 1490. 正答率(テスト) = 0.9511
Generation: 1500. 正答率(トレーニング) = 0.97
                : 1500. 正答率(テスト) = 0.9488
Generation: 1510. 正答率(トレーニング) = 0.97
                : 1510. 正答率(テスト) = 0.9497
Generation: 1520. 正答率(トレーニング) = 0.92
                : 1520. 正答率(テスト) = 0.949
Generation: 1530. 正答率(トレーニング) = 0.97
                : 1530. 正答率(テスト) = 0.9487
Generation: 1540. 正答率(トレーニング) = 0.95
                : 1540. 正答率(テスト) = 0.9432
Generation: 1550. 正答率(トレーニング) = 0.93
                : 1550. 正答率(テスト) = 0.9427
Generation: 1560. 正答率(トレーニング) = 0.97
                : 1560. 正答率(テスト) = 0.9471
Generation: 1570. 正答率(トレーニング) = 0.95
                : 1570. 正答率(テスト) = 0.9474
Generation: 1580. 正答率(トレーニング) = 0.92
                : 1580. 正答率(テスト) = 0.9451
Generation: 1590. 正答率(トレーニング) = 0.97
                : 1590. 正答率(テスト) = 0.9499
Generation: 1600. 正答率(トレーニング) = 0.97
                : 1600. 正答率(テスト) = 0.9479
Generation: 1610. 正答率(トレーニング) = 0.98
                : 1610. 正答率(テスト) = 0.9514
Generation: 1620. 正答率(トレーニング) = 0.95
                : 1620. 正答率(テスト) = 0.9471
Generation: 1630. 正答率(トレーニング) = 0.95
                : 1630. 正答率(テスト) = 0.9516
Generation: 1640. 正答率(トレーニング) = 0.96
                : 1640. 正答率(テスト) = 0.9502
Generation: 1650. 正答率(トレーニング) = 0.99
                : 1650. 正答率(テスト) = 0.9484
Generation: 1660. 正答率(トレーニング) = 0.95
                : 1660. 正答率(テスト) = 0.9484
Generation: 1670. 正答率(トレーニング) = 0.96
                : 1670. 正答率(テスト) = 0.9494
Generation: 1680. 正答率(トレーニング) = 0.99
                : 1680. 正答率(テスト) = 0.9442
Generation: 1690. 正答率(トレーニング) = 0.97
                : 1690. 正答率(テスト) = 0.948
Generation: 1700. 正答率(トレーニング) = 0.93
                : 1700. 正答率(テスト) = 0.9459
Generation: 1710. 正答率(トレーニング) = 0.97
                : 1710. 正答率(テスト) = 0.9467
Generation: 1720. 正答率(トレーニング) = 0.95
                : 1720. 正答率(テスト) = 0.946
Generation: 1730. 正答率(トレーニング) = 0.95
                : 1730. 正答率(テスト) = 0.9512
Generation: 1740. 正答率(トレーニング) = 0.97
                : 1740. 正答率(テスト) = 0.9477
Generation: 1750. 正答率(トレーニング) = 0.92
                : 1750. 正答率(テスト) = 0.9504
Generation: 1760. 正答率(トレーニング) = 0.96
                : 1760. 正答率(テスト) = 0.9508
Generation: 1770. 正答率(トレーニング) = 0.94
                : 1770. 正答率(テスト) = 0.9491
Generation: 1780. 正答率(トレーニング) = 0.96
                : 1780. 正答率(テスト) = 0.9512
Generation: 1790. 正答率(トレーニング) = 0.95
                : 1790. 正答率(テスト) = 0.9501
Generation: 1800. 正答率(トレーニング) = 0.97
                : 1800. 正答率(テスト) = 0.9541
Generation: 1810. 正答率(トレーニング) = 0.96
                : 1810. 正答率(テスト) = 0.9498
Generation: 1820. 正答率(トレーニング) = 0.96
                : 1820. 正答率(テスト) = 0.9522
Generation: 1830. 正答率(トレーニング) = 0.95
                : 1830. 正答率(テスト) = 0.9481
Generation: 1840. 正答率(トレーニング) = 0.93
                : 1840. 正答率(テスト) = 0.9514
Generation: 1850. 正答率(トレーニング) = 0.96
                : 1850. 正答率(テスト) = 0.9481
Generation: 1860. 正答率(トレーニング) = 0.97
                : 1860. 正答率(テスト) = 0.9513
Generation: 1870. 正答率(トレーニング) = 0.94
                : 1870. 正答率(テスト) = 0.9523
Generation: 1880. 正答率(トレーニング) = 0.96
                : 1880. 正答率(テスト) = 0.9485
Generation: 1890. 正答率(トレーニング) = 0.97
                : 1890. 正答率(テスト) = 0.9488
Generation: 1900. 正答率(トレーニング) = 0.96
                : 1900. 正答率(テスト) = 0.9534
Generation: 1910. 正答率(トレーニング) = 0.99
                : 1910. 正答率(テスト) = 0.956
Generation: 1920. 正答率(トレーニング) = 0.99
                : 1920. 正答率(テスト) = 0.9523
Generation: 1930. 正答率(トレーニング) = 0.96
                : 1930. 正答率(テスト) = 0.9494
Generation: 1940. 正答率(トレーニング) = 0.96
                : 1940. 正答率(テスト) = 0.9538
Generation: 1950. 正答率(トレーニング) = 0.95
                : 1950. 正答率(テスト) = 0.9507
Generation: 1960. 正答率(トレーニング) = 0.98
                : 1960. 正答率(テスト) = 0.9537
Generation: 1970. 正答率(トレーニング) = 0.94
                : 1970. 正答率(テスト) = 0.9522
Generation: 1980. 正答率(トレーニング) = 0.99
                : 1980. 正答率(テスト) = 0.9521
Generation: 1990. 正答率(トレーニング) = 0.96
                : 1990. 正答率(テスト) = 0.9538
Generation: 2000. 正答率(トレーニング) = 0.95
                : 2000. 正答率(テスト) = 0.9545

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1043122/4c28124d-146c-2c24-f672-9ed9e67a0da7.png)

バッチ正規化

```python
import numpy as np
from collections import OrderedDict
from common import layers
from data.mnist import load_mnist
import matplotlib.pyplot as plt
from multi_layer_net import MultiLayerNet
from common import optimizer

# バッチ正則化 layer
class BatchNormalization:
    '''
    gamma: スケール係数
    beta: オフセット
    momentum: 慣性
    running_mean: テスト時に使用する平均
    running_var: テスト時に使用する分散
    '''
    def __init__(self, gamma, beta, momentum=0.9, running_mean=None, running_var=None):
        self.gamma = gamma
        self.beta = beta
        self.momentum = momentum
        self.input_shape = None

        self.running_mean = running_mean
        self.running_var = running_var  
        
        # backward時に使用する中間データ
        self.batch_size = None
        self.xc = None
        self.std = None
        self.dgamma = None
        self.dbeta = None

    def forward(self, x, train_flg=True):
        if self.running_mean is None:
            N, D = x.shape
            self.running_mean = np.zeros(D)
            self.running_var = np.zeros(D)
                        
        if train_flg:
            mu = x.mean(axis=0) # 平均
            xc = x - mu # xをセンタリング
            var = np.mean(xc**2, axis=0) # 分散
            std = np.sqrt(var + 10e-7) # スケーリング
            xn = xc / std
            
            self.batch_size = x.shape[0]
            self.xc = xc
            self.xn = xn
            self.std = std
            self.running_mean = self.momentum * self.running_mean + (1-self.momentum) * mu # 平均値の加重平均
            self.running_var = self.momentum * self.running_var + (1-self.momentum) * var #分散値の加重平均
        else:
            xc = x - self.running_mean
            xn = xc / ((np.sqrt(self.running_var + 10e-7)))
            
        out = self.gamma * xn + self.beta 
        
        return out

    def backward(self, dout):
        dbeta = dout.sum(axis=0)
        dgamma = np.sum(self.xn * dout, axis=0)
        dxn = self.gamma * dout
        dxc = dxn / self.std
        dstd = -np.sum((dxn * self.xc) / (self.std * self.std), axis=0)
        dvar = 0.5 * dstd / self.std
        dxc += (2.0 / self.batch_size) * self.xc * dvar
        dmu = np.sum(dxc, axis=0)
        dx = dxc - dmu / self.batch_size
        
        self.dgamma = dgamma
        self.dbeta = dbeta

        return dx    

```

```python
(x_train, d_train), (x_test, d_test) = load_mnist(normalize=True)

print("データ読み込み完了")


# batch_normalizationの設定 =======================
use_batchnorm = True
# use_batchnorm = False
# ====================================================

network = MultiLayerNet(input_size=784, hidden_size_list=[40, 20], output_size=10,
                        activation='sigmoid', weight_init_std='Xavier', use_batchnorm=use_batchnorm)

iters_num = 1000
train_size = x_train.shape[0]
batch_size = 100
learning_rate=0.01

train_loss_list = []
accuracies_train = []
accuracies_test = []

plot_interval=10


for i in range(iters_num):
    batch_mask = np.random.choice(train_size, batch_size)
    x_batch = x_train[batch_mask]
    d_batch = d_train[batch_mask]

    grad = network.gradient(x_batch, d_batch)
    for key in ('W1', 'W2', 'W3', 'b1', 'b2', 'b3'):
        network.params[key] -= learning_rate * grad[key]

        loss = network.loss(x_batch, d_batch)
        train_loss_list.append(loss)        
        
    if (i + 1) % plot_interval == 0:
        accr_test = network.accuracy(x_test, d_test)
        accuracies_test.append(accr_test)        
        accr_train = network.accuracy(x_batch, d_batch)
        accuracies_train.append(accr_train)
        
        print('Generation: ' + str(i+1) + '. 正答率(トレーニング) = ' + str(accr_train))
        print('                : ' + str(i+1) + '. 正答率(テスト) = ' + str(accr_test))
                

lists = range(0, iters_num, plot_interval)
plt.plot(lists, accuracies_train, label="training set")
plt.plot(lists, accuracies_test,  label="test set")
plt.legend(loc="lower right")
plt.title("accuracy")
plt.xlabel("count")
plt.ylabel("accuracy")
plt.ylim(0, 1.0)
# グラフの表示
plt.show()
```

>データ読み込み完了
Generation: 10. 正答率(トレーニング) = 0.16
                : 10. 正答率(テスト) = 0.1483
Generation: 20. 正答率(トレーニング) = 0.19
                : 20. 正答率(テスト) = 0.1994
Generation: 30. 正答率(トレーニング) = 0.21
                : 30. 正答率(テスト) = 0.2261
Generation: 40. 正答率(トレーニング) = 0.23
                : 40. 正答率(テスト) = 0.2413
Generation: 50. 正答率(トレーニング) = 0.25
                : 50. 正答率(テスト) = 0.257
Generation: 60. 正答率(トレーニング) = 0.23
                : 60. 正答率(テスト) = 0.269
Generation: 70. 正答率(トレーニング) = 0.35
                : 70. 正答率(テスト) = 0.2796
Generation: 80. 正答率(トレーニング) = 0.21
                : 80. 正答率(テスト) = 0.3095
Generation: 90. 正答率(トレーニング) = 0.34
                : 90. 正答率(テスト) = 0.3403
Generation: 100. 正答率(トレーニング) = 0.45
                : 100. 正答率(テスト) = 0.3788
Generation: 110. 正答率(トレーニング) = 0.35
                : 110. 正答率(テスト) = 0.4049
Generation: 120. 正答率(トレーニング) = 0.32
                : 120. 正答率(テスト) = 0.431
Generation: 130. 正答率(トレーニング) = 0.59
                : 130. 正答率(テスト) = 0.4492
Generation: 140. 正答率(トレーニング) = 0.46
                : 140. 正答率(テスト) = 0.4631
Generation: 150. 正答率(トレーニング) = 0.6
                : 150. 正答率(テスト) = 0.4813
Generation: 160. 正答率(トレーニング) = 0.46
                : 160. 正答率(テスト) = 0.5033
Generation: 170. 正答率(トレーニング) = 0.58
                : 170. 正答率(テスト) = 0.5194
Generation: 180. 正答率(トレーニング) = 0.49
                : 180. 正答率(テスト) = 0.5323
Generation: 190. 正答率(トレーニング) = 0.48
                : 190. 正答率(テスト) = 0.5455
Generation: 200. 正答率(トレーニング) = 0.63
                : 200. 正答率(テスト) = 0.5631
Generation: 210. 正答率(トレーニング) = 0.54
                : 210. 正答率(テスト) = 0.5842
Generation: 220. 正答率(トレーニング) = 0.59
                : 220. 正答率(テスト) = 0.594
Generation: 230. 正答率(トレーニング) = 0.57
                : 230. 正答率(テスト) = 0.5999
Generation: 240. 正答率(トレーニング) = 0.62
                : 240. 正答率(テスト) = 0.6112
Generation: 250. 正答率(トレーニング) = 0.6
                : 250. 正答率(テスト) = 0.6145
Generation: 260. 正答率(トレーニング) = 0.64
                : 260. 正答率(テスト) = 0.6207
Generation: 270. 正答率(トレーニング) = 0.65
                : 270. 正答率(テスト) = 0.6351
Generation: 280. 正答率(トレーニング) = 0.64
                : 280. 正答率(テスト) = 0.6487
Generation: 290. 正答率(トレーニング) = 0.57
                : 290. 正答率(テスト) = 0.6583
Generation: 300. 正答率(トレーニング) = 0.69
                : 300. 正答率(テスト) = 0.6675
Generation: 310. 正答率(トレーニング) = 0.62
                : 310. 正答率(テスト) = 0.6709
Generation: 320. 正答率(トレーニング) = 0.73
                : 320. 正答率(テスト) = 0.6812
Generation: 330. 正答率(トレーニング) = 0.75
                : 330. 正答率(テスト) = 0.6871
Generation: 340. 正答率(トレーニング) = 0.69
                : 340. 正答率(テスト) = 0.6888
Generation: 350. 正答率(トレーニング) = 0.66
                : 350. 正答率(テスト) = 0.6924
Generation: 360. 正答率(トレーニング) = 0.69
                : 360. 正答率(テスト) = 0.695
Generation: 370. 正答率(トレーニング) = 0.65
                : 370. 正答率(テスト) = 0.7005
Generation: 380. 正答率(トレーニング) = 0.71
                : 380. 正答率(テスト) = 0.7024
Generation: 390. 正答率(トレーニング) = 0.71
                : 390. 正答率(テスト) = 0.7095
Generation: 400. 正答率(トレーニング) = 0.82
                : 400. 正答率(テスト) = 0.7169
Generation: 410. 正答率(トレーニング) = 0.71
                : 410. 正答率(テスト) = 0.7187
Generation: 420. 正答率(トレーニング) = 0.7
                : 420. 正答率(テスト) = 0.7187
Generation: 430. 正答率(トレーニング) = 0.76
                : 430. 正答率(テスト) = 0.7228
Generation: 440. 正答率(トレーニング) = 0.65
                : 440. 正答率(テスト) = 0.7255
Generation: 450. 正答率(トレーニング) = 0.71
                : 450. 正答率(テスト) = 0.7275
Generation: 460. 正答率(トレーニング) = 0.62
                : 460. 正答率(テスト) = 0.7309
Generation: 470. 正答率(トレーニング) = 0.74
                : 470. 正答率(テスト) = 0.7326
Generation: 480. 正答率(トレーニング) = 0.73
                : 480. 正答率(テスト) = 0.7344
Generation: 490. 正答率(トレーニング) = 0.77
                : 490. 正答率(テスト) = 0.7363
Generation: 500. 正答率(トレーニング) = 0.66
                : 500. 正答率(テスト) = 0.7335
Generation: 510. 正答率(トレーニング) = 0.71
                : 510. 正答率(テスト) = 0.7372
Generation: 520. 正答率(トレーニング) = 0.74
                : 520. 正答率(テスト) = 0.7358
Generation: 530. 正答率(トレーニング) = 0.71
                : 530. 正答率(テスト) = 0.7446
Generation: 540. 正答率(トレーニング) = 0.76
                : 540. 正答率(テスト) = 0.7422
Generation: 550. 正答率(トレーニング) = 0.81
                : 550. 正答率(テスト) = 0.7481
Generation: 560. 正答率(トレーニング) = 0.73
                : 560. 正答率(テスト) = 0.7472
Generation: 570. 正答率(トレーニング) = 0.8
                : 570. 正答率(テスト) = 0.75
Generation: 580. 正答率(トレーニング) = 0.78
                : 580. 正答率(テスト) = 0.7543
Generation: 590. 正答率(トレーニング) = 0.77
                : 590. 正答率(テスト) = 0.7574
Generation: 600. 正答率(トレーニング) = 0.75
                : 600. 正答率(テスト) = 0.7568
Generation: 610. 正答率(トレーニング) = 0.83
                : 610. 正答率(テスト) = 0.7555
Generation: 620. 正答率(トレーニング) = 0.76
                : 620. 正答率(テスト) = 0.7559
Generation: 630. 正答率(トレーニング) = 0.72
                : 630. 正答率(テスト) = 0.7566
Generation: 640. 正答率(トレーニング) = 0.75
                : 640. 正答率(テスト) = 0.7559
Generation: 650. 正答率(トレーニング) = 0.73
                : 650. 正答率(テスト) = 0.7573
Generation: 660. 正答率(トレーニング) = 0.75
                : 660. 正答率(テスト) = 0.7567
Generation: 670. 正答率(トレーニング) = 0.69
                : 670. 正答率(テスト) = 0.756
Generation: 680. 正答率(トレーニング) = 0.79
                : 680. 正答率(テスト) = 0.7612
Generation: 690. 正答率(トレーニング) = 0.7
                : 690. 正答率(テスト) = 0.7613
Generation: 700. 正答率(トレーニング) = 0.79
                : 700. 正答率(テスト) = 0.762
Generation: 710. 正答率(トレーニング) = 0.69
                : 710. 正答率(テスト) = 0.7633
Generation: 720. 正答率(トレーニング) = 0.78
                : 720. 正答率(テスト) = 0.7672
Generation: 730. 正答率(トレーニング) = 0.78
                : 730. 正答率(テスト) = 0.7667
Generation: 740. 正答率(トレーニング) = 0.75
                : 740. 正答率(テスト) = 0.772
Generation: 750. 正答率(トレーニング) = 0.76
                : 750. 正答率(テスト) = 0.7701
Generation: 760. 正答率(トレーニング) = 0.7
                : 760. 正答率(テスト) = 0.7729
Generation: 770. 正答率(トレーニング) = 0.8
                : 770. 正答率(テスト) = 0.774
Generation: 780. 正答率(トレーニング) = 0.78
                : 780. 正答率(テスト) = 0.7758
Generation: 790. 正答率(トレーニング) = 0.84
                : 790. 正答率(テスト) = 0.7765
Generation: 800. 正答率(トレーニング) = 0.76
                : 800. 正答率(テスト) = 0.7788
Generation: 810. 正答率(トレーニング) = 0.79
                : 810. 正答率(テスト) = 0.7776
Generation: 820. 正答率(トレーニング) = 0.76
                : 820. 正答率(テスト) = 0.7778
Generation: 830. 正答率(トレーニング) = 0.76
                : 830. 正答率(テスト) = 0.7769
Generation: 840. 正答率(トレーニング) = 0.7
                : 840. 正答率(テスト) = 0.7816
Generation: 850. 正答率(トレーニング) = 0.82
                : 850. 正答率(テスト) = 0.7847
Generation: 860. 正答率(トレーニング) = 0.78
                : 860. 正答率(テスト) = 0.7837
Generation: 870. 正答率(トレーニング) = 0.8
                : 870. 正答率(テスト) = 0.7836
Generation: 880. 正答率(トレーニング) = 0.8
                : 880. 正答率(テスト) = 0.779
Generation: 890. 正答率(トレーニング) = 0.77
                : 890. 正答率(テスト) = 0.7789
Generation: 900. 正答率(トレーニング) = 0.82
                : 900. 正答率(テスト) = 0.7822
Generation: 910. 正答率(トレーニング) = 0.8
                : 910. 正答率(テスト) = 0.7838
Generation: 920. 正答率(トレーニング) = 0.82
                : 920. 正答率(テスト) = 0.7845
Generation: 930. 正答率(トレーニング) = 0.74
                : 930. 正答率(テスト) = 0.7861
Generation: 940. 正答率(トレーニング) = 0.71
                : 940. 正答率(テスト) = 0.7842
Generation: 950. 正答率(トレーニング) = 0.83
                : 950. 正答率(テスト) = 0.7854
Generation: 960. 正答率(トレーニング) = 0.74
                : 960. 正答率(テスト) = 0.7859
Generation: 970. 正答率(トレーニング) = 0.82
                : 970. 正答率(テスト) = 0.7879
Generation: 980. 正答率(トレーニング) = 0.81
                : 980. 正答率(テスト) = 0.7888
Generation: 990. 正答率(トレーニング) = 0.81
                : 990. 正答率(テスト) = 0.7917
Generation: 1000. 正答率(トレーニング) = 0.69
                : 1000. 正答率(テスト) = 0.7957

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1043122/9bf130d2-49cc-981e-c158-c4668f46cb37.png)



## 2. 学習率最適化手法
初期の学習率設定方法の指針
・初期の学習率を大きく設定し、徐々に学習率を小さくしていく
・パラメータ毎に学習率を可変させる
→学習率最適化手法を利用して、学習率を最適化

学習率最適化手法は
・モメンタム
・AdaGrad
・RMSprop
・Adam
などがある。

モメンタム
勾配の移動平均を出して振動を抑える（過去の勾配たちを考慮することで急な変化を抑える）。
誤差をパラメータで微分した値と学習率$\varepsilon$ の積を減算した後、現在の重みに前回の重みを減算した値と慣性（ハイパーパラメータ）$\mu$ の積を加える。

```math
\begin{eqnarray}
V_t &=&\mu V_{t−1}−\varepsilon \nabla E\\
\mathbb{w}^{(t+1)}&=&\mathbb{w}^{(t)}+V_t\\
慣性&：&\mu
\end{eqnarray}

```
モメンタムのメリット
局所的最適解にはならず、比較的大域的最適解になりやすい。
⇒　谷間についてから最も低い位置（最適値）にいくまでの時間が早い

AdaGrad
誤差をパラメータで微分したもの$\nabla E$と再定義した学習率$\varepsilon\frac{1}{\sqrt{h_t}+\theta}$の積を減算する。
学習率が徐々に小さくなっていく。


```math
\begin{eqnarray}
h_0&=&\theta\\
h_t&=&h_{t−1}+\left(\nabla E\right)^2\\
\mathbb{w}^{(t+1)}&=&\mathbb{w}^{(t)}-\varepsilon\frac{1}{\sqrt{h_t}+\theta} \nabla E
\end{eqnarray}

```

勾配の緩やかな斜面に対して、最小値に近づける。
学習率が徐々に小さくなるので、鞍点問題を引き起こす事があった。


RMSprop
AdaGradの改良版。一度学習率が$0$に近づくとほとんど変化しなくなるAdaGradの問題を改良したもの。
誤差をパラメータで微分したものと再定義した学習率の積を減算する。

```math
\begin{eqnarray}
h_t&=&\alpha h_{t−1}+(1−\alpha)\left(\nabla E\right)^2\\
\mathbb{w}^{(t+1)}&=&\mathbb{w}^{(t)}-\varepsilon\frac{1}{\sqrt{h_t}+\theta} \nabla E
\end{eqnarray}

```
局所的最適解にはならず、大域的最適解となる。
ハイパーパラメータの調整が必要な場合が少ない

Adam
・モメンタムの、過去の勾配の指数関数的減衰平均
・RMSPropの、過去の勾配の2乗の指数関数的減衰平均
上記をそれぞれ孕んだ最適化アルゴリズムである。

確認テスト
・モメンタム、AdaGrad、RMSpropの特徴をそれぞれ簡潔に説明せよ。
モメンタム：大局的局所解になりやすい。
AdaGrad：勾配が緩やな場合でも最適解が見つけられる
RMSprop：AdaGradの改良版。局所最適解にならず大域的最適解になりやすい。ハイパーパラメータの調整が必要な場合が少ない

実装
SGD

```python
import sys, os
sys.path.append(os.pardir)  # 親ディレクトリのファイルをインポートするための設定
import numpy as np
from collections import OrderedDict
from common import layers
from data.mnist import load_mnist
import matplotlib.pyplot as plt
from multi_layer_net import MultiLayerNet


# データの読み込み
(x_train, d_train), (x_test, d_test) = load_mnist(normalize=True, one_hot_label=True)

print("データ読み込み完了")

# batch_normalizationの設定 ================================
# use_batchnorm = True
use_batchnorm = False
# ====================================================


network = MultiLayerNet(input_size=784, hidden_size_list=[40, 20], output_size=10, activation='sigmoid', weight_init_std=0.01,
                       use_batchnorm=use_batchnorm)

iters_num = 1000
train_size = x_train.shape[0]
batch_size = 100
learning_rate = 0.01

train_loss_list = []
accuracies_train = []
accuracies_test = []

plot_interval=10

for i in range(iters_num):
    batch_mask = np.random.choice(train_size, batch_size)
    x_batch = x_train[batch_mask]
    d_batch = d_train[batch_mask]

    # 勾配
    grad = network.gradient(x_batch, d_batch)
    
    for key in ('W1', 'W2', 'W3', 'b1', 'b2', 'b3'):
        network.params[key] -= learning_rate * grad[key]
        
        loss = network.loss(x_batch, d_batch)
        train_loss_list.append(loss)
    
    
    if (i + 1) % plot_interval == 0:
        accr_test = network.accuracy(x_test, d_test)
        accuracies_test.append(accr_test)        
        accr_train = network.accuracy(x_batch, d_batch)
        accuracies_train.append(accr_train)
        
        print('Generation: ' + str(i+1) + '. 正答率(トレーニング) = ' + str(accr_train))
        print('                : ' + str(i+1) + '. 正答率(テスト) = ' + str(accr_test))

        
lists = range(0, iters_num, plot_interval)
plt.plot(lists, accuracies_train, label="training set")
plt.plot(lists, accuracies_test,  label="test set")
plt.legend(loc="lower right")
plt.title("accuracy")
plt.xlabel("count")
plt.ylabel("accuracy")
plt.ylim(0, 1.0)
# グラフの表示
plt.show()
```

>データ読み込み完了
Generation: 10. 正答率(トレーニング) = 0.09
                : 10. 正答率(テスト) = 0.1135
Generation: 20. 正答率(トレーニング) = 0.14
                : 20. 正答率(テスト) = 0.1135
Generation: 30. 正答率(トレーニング) = 0.11
                : 30. 正答率(テスト) = 0.1135
Generation: 40. 正答率(トレーニング) = 0.14
                : 40. 正答率(テスト) = 0.1135
Generation: 50. 正答率(トレーニング) = 0.14
                : 50. 正答率(テスト) = 0.1135
Generation: 60. 正答率(トレーニング) = 0.16
                : 60. 正答率(テスト) = 0.1135
Generation: 70. 正答率(トレーニング) = 0.08
                : 70. 正答率(テスト) = 0.1135
Generation: 80. 正答率(トレーニング) = 0.07
                : 80. 正答率(テスト) = 0.1135
Generation: 90. 正答率(トレーニング) = 0.13
                : 90. 正答率(テスト) = 0.1135
Generation: 100. 正答率(トレーニング) = 0.13
                : 100. 正答率(テスト) = 0.1135
Generation: 110. 正答率(トレーニング) = 0.1
                : 110. 正答率(テスト) = 0.1135
Generation: 120. 正答率(トレーニング) = 0.08
                : 120. 正答率(テスト) = 0.1135
Generation: 130. 正答率(トレーニング) = 0.11
                : 130. 正答率(テスト) = 0.1135
Generation: 140. 正答率(トレーニング) = 0.07
                : 140. 正答率(テスト) = 0.1135
Generation: 150. 正答率(トレーニング) = 0.14
                : 150. 正答率(テスト) = 0.1135
Generation: 160. 正答率(トレーニング) = 0.14
                : 160. 正答率(テスト) = 0.1135
Generation: 170. 正答率(トレーニング) = 0.1
                : 170. 正答率(テスト) = 0.1135
Generation: 180. 正答率(トレーニング) = 0.14
                : 180. 正答率(テスト) = 0.1135
Generation: 190. 正答率(トレーニング) = 0.14
                : 190. 正答率(テスト) = 0.1135
Generation: 200. 正答率(トレーニング) = 0.17
                : 200. 正答率(テスト) = 0.1135
Generation: 210. 正答率(トレーニング) = 0.17
                : 210. 正答率(テスト) = 0.1135
Generation: 220. 正答率(トレーニング) = 0.21
                : 220. 正答率(テスト) = 0.1135
Generation: 230. 正答率(トレーニング) = 0.14
                : 230. 正答率(テスト) = 0.1135
Generation: 240. 正答率(トレーニング) = 0.1
                : 240. 正答率(テスト) = 0.1135
Generation: 250. 正答率(トレーニング) = 0.06
                : 250. 正答率(テスト) = 0.1135
Generation: 260. 正答率(トレーニング) = 0.11
                : 260. 正答率(テスト) = 0.1135
Generation: 270. 正答率(トレーニング) = 0.15
                : 270. 正答率(テスト) = 0.1135
Generation: 280. 正答率(トレーニング) = 0.14
                : 280. 正答率(テスト) = 0.1135
Generation: 290. 正答率(トレーニング) = 0.09
                : 290. 正答率(テスト) = 0.1135
Generation: 300. 正答率(トレーニング) = 0.12
                : 300. 正答率(テスト) = 0.1135
Generation: 310. 正答率(トレーニング) = 0.12
                : 310. 正答率(テスト) = 0.1135
Generation: 320. 正答率(トレーニング) = 0.13
                : 320. 正答率(テスト) = 0.1135
Generation: 330. 正答率(トレーニング) = 0.07
                : 330. 正答率(テスト) = 0.1135
Generation: 340. 正答率(トレーニング) = 0.08
                : 340. 正答率(テスト) = 0.1135
Generation: 350. 正答率(トレーニング) = 0.1
                : 350. 正答率(テスト) = 0.1135
Generation: 360. 正答率(トレーニング) = 0.11
                : 360. 正答率(テスト) = 0.1135
Generation: 370. 正答率(トレーニング) = 0.1
                : 370. 正答率(テスト) = 0.1135
Generation: 380. 正答率(トレーニング) = 0.12
                : 380. 正答率(テスト) = 0.1135
Generation: 390. 正答率(トレーニング) = 0.1
                : 390. 正答率(テスト) = 0.1135
Generation: 400. 正答率(トレーニング) = 0.08
                : 400. 正答率(テスト) = 0.1135
Generation: 410. 正答率(トレーニング) = 0.09
                : 410. 正答率(テスト) = 0.1135
Generation: 420. 正答率(トレーニング) = 0.15
                : 420. 正答率(テスト) = 0.1135
Generation: 430. 正答率(トレーニング) = 0.09
                : 430. 正答率(テスト) = 0.1135
Generation: 440. 正答率(トレーニング) = 0.19
                : 440. 正答率(テスト) = 0.1135
Generation: 450. 正答率(トレーニング) = 0.08
                : 450. 正答率(テスト) = 0.1135
Generation: 460. 正答率(トレーニング) = 0.12
                : 460. 正答率(テスト) = 0.1135
Generation: 470. 正答率(トレーニング) = 0.1
                : 470. 正答率(テスト) = 0.1135
Generation: 480. 正答率(トレーニング) = 0.11
                : 480. 正答率(テスト) = 0.1135
Generation: 490. 正答率(トレーニング) = 0.12
                : 490. 正答率(テスト) = 0.1135
Generation: 500. 正答率(トレーニング) = 0.12
                : 500. 正答率(テスト) = 0.1135
Generation: 510. 正答率(トレーニング) = 0.14
                : 510. 正答率(テスト) = 0.1135
Generation: 520. 正答率(トレーニング) = 0.16
                : 520. 正答率(テスト) = 0.1135
Generation: 530. 正答率(トレーニング) = 0.08
                : 530. 正答率(テスト) = 0.1135
Generation: 540. 正答率(トレーニング) = 0.08
                : 540. 正答率(テスト) = 0.1135
Generation: 550. 正答率(トレーニング) = 0.09
                : 550. 正答率(テスト) = 0.1135
Generation: 560. 正答率(トレーニング) = 0.11
                : 560. 正答率(テスト) = 0.1135
Generation: 570. 正答率(トレーニング) = 0.1
                : 570. 正答率(テスト) = 0.1135
Generation: 580. 正答率(トレーニング) = 0.14
                : 580. 正答率(テスト) = 0.1135
Generation: 590. 正答率(トレーニング) = 0.09
                : 590. 正答率(テスト) = 0.1135
Generation: 600. 正答率(トレーニング) = 0.12
                : 600. 正答率(テスト) = 0.1135
Generation: 610. 正答率(トレーニング) = 0.1
                : 610. 正答率(テスト) = 0.1135
Generation: 620. 正答率(トレーニング) = 0.08
                : 620. 正答率(テスト) = 0.1135
Generation: 630. 正答率(トレーニング) = 0.07
                : 630. 正答率(テスト) = 0.1135
Generation: 640. 正答率(トレーニング) = 0.08
                : 640. 正答率(テスト) = 0.1135
Generation: 650. 正答率(トレーニング) = 0.12
                : 650. 正答率(テスト) = 0.1135
Generation: 660. 正答率(トレーニング) = 0.16
                : 660. 正答率(テスト) = 0.1135
Generation: 670. 正答率(トレーニング) = 0.07
                : 670. 正答率(テスト) = 0.1135
Generation: 680. 正答率(トレーニング) = 0.09
                : 680. 正答率(テスト) = 0.1135
Generation: 690. 正答率(トレーニング) = 0.17
                : 690. 正答率(テスト) = 0.1135
Generation: 700. 正答率(トレーニング) = 0.07
                : 700. 正答率(テスト) = 0.1135
Generation: 710. 正答率(トレーニング) = 0.07
                : 710. 正答率(テスト) = 0.1135
Generation: 720. 正答率(トレーニング) = 0.11
                : 720. 正答率(テスト) = 0.1135
Generation: 730. 正答率(トレーニング) = 0.14
                : 730. 正答率(テスト) = 0.1135
Generation: 740. 正答率(トレーニング) = 0.08
                : 740. 正答率(テスト) = 0.1135
Generation: 750. 正答率(トレーニング) = 0.18
                : 750. 正答率(テスト) = 0.1135
Generation: 760. 正答率(トレーニング) = 0.08
                : 760. 正答率(テスト) = 0.1135
Generation: 770. 正答率(トレーニング) = 0.02
                : 770. 正答率(テスト) = 0.1135
Generation: 780. 正答率(トレーニング) = 0.1
                : 780. 正答率(テスト) = 0.1135
Generation: 790. 正答率(トレーニング) = 0.06
                : 790. 正答率(テスト) = 0.1135
Generation: 800. 正答率(トレーニング) = 0.09
                : 800. 正答率(テスト) = 0.1135
Generation: 810. 正答率(トレーニング) = 0.13
                : 810. 正答率(テスト) = 0.1135
Generation: 820. 正答率(トレーニング) = 0.13
                : 820. 正答率(テスト) = 0.1135
Generation: 830. 正答率(トレーニング) = 0.12
                : 830. 正答率(テスト) = 0.1135
Generation: 840. 正答率(トレーニング) = 0.12
                : 840. 正答率(テスト) = 0.1135
Generation: 850. 正答率(トレーニング) = 0.1
                : 850. 正答率(テスト) = 0.1135
Generation: 860. 正答率(トレーニング) = 0.09
                : 860. 正答率(テスト) = 0.1135
Generation: 870. 正答率(トレーニング) = 0.11
                : 870. 正答率(テスト) = 0.1135
Generation: 880. 正答率(トレーニング) = 0.07
                : 880. 正答率(テスト) = 0.1135
Generation: 890. 正答率(トレーニング) = 0.16
                : 890. 正答率(テスト) = 0.1135
Generation: 900. 正答率(トレーニング) = 0.19
                : 900. 正答率(テスト) = 0.1135
Generation: 910. 正答率(トレーニング) = 0.11
                : 910. 正答率(テスト) = 0.1135
Generation: 920. 正答率(トレーニング) = 0.08
                : 920. 正答率(テスト) = 0.1135
Generation: 930. 正答率(トレーニング) = 0.19
                : 930. 正答率(テスト) = 0.1135
Generation: 940. 正答率(トレーニング) = 0.15
                : 940. 正答率(テスト) = 0.1135
Generation: 950. 正答率(トレーニング) = 0.07
                : 950. 正答率(テスト) = 0.1135
Generation: 960. 正答率(トレーニング) = 0.13
                : 960. 正答率(テスト) = 0.1135
Generation: 970. 正答率(トレーニング) = 0.11
                : 970. 正答率(テスト) = 0.1135
Generation: 980. 正答率(トレーニング) = 0.11
                : 980. 正答率(テスト) = 0.1135
Generation: 990. 正答率(トレーニング) = 0.18
                : 990. 正答率(テスト) = 0.1135
Generation: 1000. 正答率(トレーニング) = 0.13
                : 1000. 正答率(テスト) = 0.1135

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1043122/6047270f-72dd-e6af-4856-1e28e3d266eb.png)


Momentum

```python

# データの読み込み
(x_train, d_train), (x_test, d_test) = load_mnist(normalize=True, one_hot_label=True)

print("データ読み込み完了")

# batch_normalizationの設定 ================================
# use_batchnorm = True
use_batchnorm = False
# ====================================================

network = MultiLayerNet(input_size=784, hidden_size_list=[40, 20], output_size=10, activation='sigmoid', weight_init_std=0.01,
                       use_batchnorm=use_batchnorm)

iters_num = 1000
train_size = x_train.shape[0]
batch_size = 100
learning_rate = 0.01
# 慣性
momentum = 0.9

train_loss_list = []
accuracies_train = []
accuracies_test = []

plot_interval=10

for i in range(iters_num):
    batch_mask = np.random.choice(train_size, batch_size)
    x_batch = x_train[batch_mask]
    d_batch = d_train[batch_mask]

    # 勾配
    grad = network.gradient(x_batch, d_batch)
    if i == 0:
        v = {}
    for key in ('W1', 'W2', 'W3', 'b1', 'b2', 'b3'):
        if i == 0:
            v[key] = np.zeros_like(network.params[key])
        v[key] = momentum * v[key] - learning_rate * grad[key]
        network.params[key] += v[key]

        loss = network.loss(x_batch, d_batch)
        train_loss_list.append(loss)
        
    if (i + 1) % plot_interval == 0:
        accr_test = network.accuracy(x_test, d_test)
        accuracies_test.append(accr_test)        
        accr_train = network.accuracy(x_batch, d_batch)
        accuracies_train.append(accr_train)

        print('Generation: ' + str(i+1) + '. 正答率(トレーニング) = ' + str(accr_train))
        print('                : ' + str(i+1) + '. 正答率(テスト) = ' + str(accr_test))
        
        
lists = range(0, iters_num, plot_interval)
plt.plot(lists, accuracies_train, label="training set")
plt.plot(lists, accuracies_test,  label="test set")
plt.legend(loc="lower right")
plt.title("accuracy")
plt.xlabel("count")
plt.ylabel("accuracy")
plt.ylim(0, 1.0)
# グラフの表示
plt.show()
```

>データ読み込み完了
Generation: 10. 正答率(トレーニング) = 0.05
                : 10. 正答率(テスト) = 0.0958
Generation: 20. 正答率(トレーニング) = 0.09
                : 20. 正答率(テスト) = 0.1135
Generation: 30. 正答率(トレーニング) = 0.1
                : 30. 正答率(テスト) = 0.101
Generation: 40. 正答率(トレーニング) = 0.09
                : 40. 正答率(テスト) = 0.1028
Generation: 50. 正答率(トレーニング) = 0.06
                : 50. 正答率(テスト) = 0.1135
Generation: 60. 正答率(トレーニング) = 0.11
                : 60. 正答率(テスト) = 0.1135
Generation: 70. 正答率(トレーニング) = 0.19
                : 70. 正答率(テスト) = 0.1135
Generation: 80. 正答率(トレーニング) = 0.19
                : 80. 正答率(テスト) = 0.1135
Generation: 90. 正答率(トレーニング) = 0.1
                : 90. 正答率(テスト) = 0.101
Generation: 100. 正答率(トレーニング) = 0.16
                : 100. 正答率(テスト) = 0.101
Generation: 110. 正答率(トレーニング) = 0.11
                : 110. 正答率(テスト) = 0.1135
Generation: 120. 正答率(トレーニング) = 0.12
                : 120. 正答率(テスト) = 0.1135
Generation: 130. 正答率(トレーニング) = 0.11
                : 130. 正答率(テスト) = 0.1135
Generation: 140. 正答率(トレーニング) = 0.09
                : 140. 正答率(テスト) = 0.1135
Generation: 150. 正答率(トレーニング) = 0.09
                : 150. 正答率(テスト) = 0.1135
Generation: 160. 正答率(トレーニング) = 0.17
                : 160. 正答率(テスト) = 0.1135
Generation: 170. 正答率(トレーニング) = 0.09
                : 170. 正答率(テスト) = 0.1135
Generation: 180. 正答率(トレーニング) = 0.11
                : 180. 正答率(テスト) = 0.1135
Generation: 190. 正答率(トレーニング) = 0.09
                : 190. 正答率(テスト) = 0.1028
Generation: 200. 正答率(トレーニング) = 0.09
                : 200. 正答率(テスト) = 0.1028
Generation: 210. 正答率(トレーニング) = 0.14
                : 210. 正答率(テスト) = 0.1028
Generation: 220. 正答率(トレーニング) = 0.15
                : 220. 正答率(テスト) = 0.1028
Generation: 230. 正答率(トレーニング) = 0.11
                : 230. 正答率(テスト) = 0.1028
Generation: 240. 正答率(トレーニング) = 0.1
                : 240. 正答率(テスト) = 0.098
Generation: 250. 正答率(トレーニング) = 0.11
                : 250. 正答率(テスト) = 0.098
Generation: 260. 正答率(トレーニング) = 0.19
                : 260. 正答率(テスト) = 0.098
Generation: 270. 正答率(トレーニング) = 0.1
                : 270. 正答率(テスト) = 0.098
Generation: 280. 正答率(トレーニング) = 0.1
                : 280. 正答率(テスト) = 0.098
Generation: 290. 正答率(トレーニング) = 0.12
                : 290. 正答率(テスト) = 0.101
Generation: 300. 正答率(トレーニング) = 0.14
                : 300. 正答率(テスト) = 0.101
Generation: 310. 正答率(トレーニング) = 0.12
                : 310. 正答率(テスト) = 0.101
Generation: 320. 正答率(トレーニング) = 0.09
                : 320. 正答率(テスト) = 0.101
Generation: 330. 正答率(トレーニング) = 0.13
                : 330. 正答率(テスト) = 0.1135
Generation: 340. 正答率(トレーニング) = 0.14
                : 340. 正答率(テスト) = 0.1135
Generation: 350. 正答率(トレーニング) = 0.13
                : 350. 正答率(テスト) = 0.1135
Generation: 360. 正答率(トレーニング) = 0.1
                : 360. 正答率(テスト) = 0.1135
Generation: 370. 正答率(トレーニング) = 0.16
                : 370. 正答率(テスト) = 0.1135
Generation: 380. 正答率(トレーニング) = 0.12
                : 380. 正答率(テスト) = 0.101
Generation: 390. 正答率(トレーニング) = 0.11
                : 390. 正答率(テスト) = 0.101
Generation: 400. 正答率(トレーニング) = 0.08
                : 400. 正答率(テスト) = 0.101
Generation: 410. 正答率(トレーニング) = 0.1
                : 410. 正答率(テスト) = 0.1032
Generation: 420. 正答率(トレーニング) = 0.08
                : 420. 正答率(テスト) = 0.1135
Generation: 430. 正答率(トレーニング) = 0.12
                : 430. 正答率(テスト) = 0.1135
Generation: 440. 正答率(トレーニング) = 0.15
                : 440. 正答率(テスト) = 0.1135
Generation: 450. 正答率(トレーニング) = 0.09
                : 450. 正答率(テスト) = 0.1135
Generation: 460. 正答率(トレーニング) = 0.11
                : 460. 正答率(テスト) = 0.1135
Generation: 470. 正答率(トレーニング) = 0.1
                : 470. 正答率(テスト) = 0.1135
Generation: 480. 正答率(トレーニング) = 0.07
                : 480. 正答率(テスト) = 0.1135
Generation: 490. 正答率(トレーニング) = 0.07
                : 490. 正答率(テスト) = 0.1028
Generation: 500. 正答率(トレーニング) = 0.1
                : 500. 正答率(テスト) = 0.1135
Generation: 510. 正答率(トレーニング) = 0.1
                : 510. 正答率(テスト) = 0.1135
Generation: 520. 正答率(トレーニング) = 0.1
                : 520. 正答率(テスト) = 0.1135
Generation: 530. 正答率(トレーニング) = 0.09
                : 530. 正答率(テスト) = 0.1135
Generation: 540. 正答率(トレーニング) = 0.12
                : 540. 正答率(テスト) = 0.1135
Generation: 550. 正答率(トレーニング) = 0.11
                : 550. 正答率(テスト) = 0.1135
Generation: 560. 正答率(トレーニング) = 0.11
                : 560. 正答率(テスト) = 0.1135
Generation: 570. 正答率(トレーニング) = 0.06
                : 570. 正答率(テスト) = 0.1135
Generation: 580. 正答率(トレーニング) = 0.13
                : 580. 正答率(テスト) = 0.1135
Generation: 590. 正答率(トレーニング) = 0.09
                : 590. 正答率(テスト) = 0.1135
Generation: 600. 正答率(トレーニング) = 0.15
                : 600. 正答率(テスト) = 0.1028
Generation: 610. 正答率(トレーニング) = 0.09
                : 610. 正答率(テスト) = 0.1028
Generation: 620. 正答率(トレーニング) = 0.09
                : 620. 正答率(テスト) = 0.1135
Generation: 630. 正答率(トレーニング) = 0.09
                : 630. 正答率(テスト) = 0.1135
Generation: 640. 正答率(トレーニング) = 0.15
                : 640. 正答率(テスト) = 0.1135
Generation: 650. 正答率(トレーニング) = 0.11
                : 650. 正答率(テスト) = 0.101
Generation: 660. 正答率(トレーニング) = 0.12
                : 660. 正答率(テスト) = 0.101
Generation: 670. 正答率(トレーニング) = 0.06
                : 670. 正答率(テスト) = 0.1135
Generation: 680. 正答率(トレーニング) = 0.12
                : 680. 正答率(テスト) = 0.1135
Generation: 690. 正答率(トレーニング) = 0.12
                : 690. 正答率(テスト) = 0.0974
Generation: 700. 正答率(トレーニング) = 0.1
                : 700. 正答率(テスト) = 0.0974
Generation: 710. 正答率(トレーニング) = 0.1
                : 710. 正答率(テスト) = 0.1028
Generation: 720. 正答率(トレーニング) = 0.11
                : 720. 正答率(テスト) = 0.1135
Generation: 730. 正答率(トレーニング) = 0.13
                : 730. 正答率(テスト) = 0.1135
Generation: 740. 正答率(トレーニング) = 0.05
                : 740. 正答率(テスト) = 0.1135
Generation: 750. 正答率(トレーニング) = 0.08
                : 750. 正答率(テスト) = 0.1135
Generation: 760. 正答率(トレーニング) = 0.12
                : 760. 正答率(テスト) = 0.1135
Generation: 770. 正答率(トレーニング) = 0.1
                : 770. 正答率(テスト) = 0.1135
Generation: 780. 正答率(トレーニング) = 0.09
                : 780. 正答率(テスト) = 0.1135
Generation: 790. 正答率(トレーニング) = 0.12
                : 790. 正答率(テスト) = 0.1135
Generation: 800. 正答率(トレーニング) = 0.11
                : 800. 正答率(テスト) = 0.1135
Generation: 810. 正答率(トレーニング) = 0.12
                : 810. 正答率(テスト) = 0.1135
Generation: 820. 正答率(トレーニング) = 0.07
                : 820. 正答率(テスト) = 0.1135
Generation: 830. 正答率(トレーニング) = 0.13
                : 830. 正答率(テスト) = 0.1135
Generation: 840. 正答率(トレーニング) = 0.17
                : 840. 正答率(テスト) = 0.1135
Generation: 850. 正答率(トレーニング) = 0.1
                : 850. 正答率(テスト) = 0.1135
Generation: 860. 正答率(トレーニング) = 0.07
                : 860. 正答率(テスト) = 0.1135
Generation: 870. 正答率(トレーニング) = 0.08
                : 870. 正答率(テスト) = 0.1135
Generation: 880. 正答率(トレーニング) = 0.15
                : 880. 正答率(テスト) = 0.1028
Generation: 890. 正答率(トレーニング) = 0.14
                : 890. 正答率(テスト) = 0.1028
Generation: 900. 正答率(トレーニング) = 0.08
                : 900. 正答率(テスト) = 0.1028
Generation: 910. 正答率(トレーニング) = 0.1
                : 910. 正答率(テスト) = 0.1135
Generation: 920. 正答率(トレーニング) = 0.07
                : 920. 正答率(テスト) = 0.1135
Generation: 930. 正答率(トレーニング) = 0.08
                : 930. 正答率(テスト) = 0.1135
Generation: 940. 正答率(トレーニング) = 0.06
                : 940. 正答率(テスト) = 0.1028
Generation: 950. 正答率(トレーニング) = 0.11
                : 950. 正答率(テスト) = 0.1135
Generation: 960. 正答率(トレーニング) = 0.07
                : 960. 正答率(テスト) = 0.1135
Generation: 970. 正答率(トレーニング) = 0.12
                : 970. 正答率(テスト) = 0.1135
Generation: 980. 正答率(トレーニング) = 0.08
                : 980. 正答率(テスト) = 0.101
Generation: 990. 正答率(トレーニング) = 0.09
                : 990. 正答率(テスト) = 0.0958
Generation: 1000. 正答率(トレーニング) = 0.1
                : 1000. 正答率(テスト) = 0.1135

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1043122/0b6d3b3e-35ff-efe9-4387-32334fb1eb6c.png)


AdaGrad

```python
# AdaGradを作ってみよう
# データの読み込み
(x_train, d_train), (x_test, d_test) = load_mnist(normalize=True, one_hot_label=True)

print("データ読み込み完了")

# batch_normalizationの設定 ================================
# use_batchnorm = True
use_batchnorm = False
# ====================================================

network = MultiLayerNet(input_size=784, hidden_size_list=[40, 20], output_size=10, activation='sigmoid', weight_init_std=0.01,
                       use_batchnorm=use_batchnorm)

iters_num = 1000
# iters_num = 500 # 処理を短縮

train_size = x_train.shape[0]
batch_size = 100
learning_rate = 0.01

# AdaGradでは不必要
# =============================

momentum = 0.9 

# =============================

train_loss_list = []
accuracies_train = []
accuracies_test = []

plot_interval=10

for i in range(iters_num):
    batch_mask = np.random.choice(train_size, batch_size)
    x_batch = x_train[batch_mask]
    d_batch = d_train[batch_mask]

    # 勾配
    grad = network.gradient(x_batch, d_batch)
    if i == 0:
        h = {}
    for key in ('W1', 'W2', 'W3', 'b1', 'b2', 'b3'):
            
        # 変更しよう  
        # ===========================================
        if i == 0:
            h[key] = np.zeros_like(network.params[key])        
        h[key] = momentum * h[key] - learning_rate * grad[key]
        network.params[key] += h[key]

        # ===========================================
        
        loss = network.loss(x_batch, d_batch)
        train_loss_list.append(loss)
        
    if (i + 1) % plot_interval == 0:
        accr_test = network.accuracy(x_test, d_test)
        accuracies_test.append(accr_test)        
        accr_train = network.accuracy(x_batch, d_batch)
        accuracies_train.append(accr_train)

        print('Generation: ' + str(i+1) + '. 正答率(トレーニング) = ' + str(accr_train))
        print('                : ' + str(i+1) + '. 正答率(テスト) = ' + str(accr_test))
        
        
lists = range(0, iters_num, plot_interval)
plt.plot(lists, accuracies_train, label="training set")
plt.plot(lists, accuracies_test,  label="test set")
plt.legend(loc="lower right")
plt.title("accuracy")
plt.xlabel("count")
plt.ylabel("accuracy")
plt.ylim(0, 1.0)
# グラフの表示
plt.show()
```

>データ読み込み完了
Generation: 10. 正答率(トレーニング) = 0.13
                : 10. 正答率(テスト) = 0.1135
Generation: 20. 正答率(トレーニング) = 0.1
                : 20. 正答率(テスト) = 0.1135
Generation: 30. 正答率(トレーニング) = 0.1
                : 30. 正答率(テスト) = 0.1135
Generation: 40. 正答率(トレーニング) = 0.09
                : 40. 正答率(テスト) = 0.1135
Generation: 50. 正答率(トレーニング) = 0.08
                : 50. 正答率(テスト) = 0.1135
Generation: 60. 正答率(トレーニング) = 0.11
                : 60. 正答率(テスト) = 0.1135
Generation: 70. 正答率(トレーニング) = 0.1
                : 70. 正答率(テスト) = 0.1135
Generation: 80. 正答率(トレーニング) = 0.1
                : 80. 正答率(テスト) = 0.1135
Generation: 90. 正答率(トレーニング) = 0.12
                : 90. 正答率(テスト) = 0.1135
Generation: 100. 正答率(トレーニング) = 0.11
                : 100. 正答率(テスト) = 0.1135
Generation: 110. 正答率(トレーニング) = 0.16
                : 110. 正答率(テスト) = 0.1135
Generation: 120. 正答率(トレーニング) = 0.16
                : 120. 正答率(テスト) = 0.1135
Generation: 130. 正答率(トレーニング) = 0.1
                : 130. 正答率(テスト) = 0.1135
Generation: 140. 正答率(トレーニング) = 0.11
                : 140. 正答率(テスト) = 0.1135
Generation: 150. 正答率(トレーニング) = 0.13
                : 150. 正答率(テスト) = 0.1135
Generation: 160. 正答率(トレーニング) = 0.09
                : 160. 正答率(テスト) = 0.1135
Generation: 170. 正答率(トレーニング) = 0.1
                : 170. 正答率(テスト) = 0.1135
Generation: 180. 正答率(トレーニング) = 0.13
                : 180. 正答率(テスト) = 0.1135
Generation: 190. 正答率(トレーニング) = 0.06
                : 190. 正答率(テスト) = 0.1135
Generation: 200. 正答率(トレーニング) = 0.1
                : 200. 正答率(テスト) = 0.1135
Generation: 210. 正答率(トレーニング) = 0.11
                : 210. 正答率(テスト) = 0.1135
Generation: 220. 正答率(トレーニング) = 0.12
                : 220. 正答率(テスト) = 0.1135
Generation: 230. 正答率(トレーニング) = 0.11
                : 230. 正答率(テスト) = 0.1135
Generation: 240. 正答率(トレーニング) = 0.1
                : 240. 正答率(テスト) = 0.1135
Generation: 250. 正答率(トレーニング) = 0.14
                : 250. 正答率(テスト) = 0.1135
Generation: 260. 正答率(トレーニング) = 0.11
                : 260. 正答率(テスト) = 0.1135
Generation: 270. 正答率(トレーニング) = 0.12
                : 270. 正答率(テスト) = 0.1135
Generation: 280. 正答率(トレーニング) = 0.08
                : 280. 正答率(テスト) = 0.1135
Generation: 290. 正答率(トレーニング) = 0.1
                : 290. 正答率(テスト) = 0.1135
Generation: 300. 正答率(トレーニング) = 0.14
                : 300. 正答率(テスト) = 0.0982
Generation: 310. 正答率(トレーニング) = 0.12
                : 310. 正答率(テスト) = 0.1135
Generation: 320. 正答率(トレーニング) = 0.12
                : 320. 正答率(テスト) = 0.1135
Generation: 330. 正答率(トレーニング) = 0.13
                : 330. 正答率(テスト) = 0.1028
Generation: 340. 正答率(トレーニング) = 0.13
                : 340. 正答率(テスト) = 0.1028
Generation: 350. 正答率(トレーニング) = 0.12
                : 350. 正答率(テスト) = 0.1028
Generation: 360. 正答率(トレーニング) = 0.09
                : 360. 正答率(テスト) = 0.1028
Generation: 370. 正答率(トレーニング) = 0.16
                : 370. 正答率(テスト) = 0.1009
Generation: 380. 正答率(トレーニング) = 0.13
                : 380. 正答率(テスト) = 0.1135
Generation: 390. 正答率(トレーニング) = 0.1
                : 390. 正答率(テスト) = 0.1135
Generation: 400. 正答率(トレーニング) = 0.15
                : 400. 正答率(テスト) = 0.1135
Generation: 410. 正答率(トレーニング) = 0.11
                : 410. 正答率(テスト) = 0.1135
Generation: 420. 正答率(トレーニング) = 0.12
                : 420. 正答率(テスト) = 0.1135
Generation: 430. 正答率(トレーニング) = 0.1
                : 430. 正答率(テスト) = 0.1135
Generation: 440. 正答率(トレーニング) = 0.1
                : 440. 正答率(テスト) = 0.1135
Generation: 450. 正答率(トレーニング) = 0.11
                : 450. 正答率(テスト) = 0.1135
Generation: 460. 正答率(トレーニング) = 0.17
                : 460. 正答率(テスト) = 0.1135
Generation: 470. 正答率(トレーニング) = 0.11
                : 470. 正答率(テスト) = 0.1135
Generation: 480. 正答率(トレーニング) = 0.17
                : 480. 正答率(テスト) = 0.1135
Generation: 490. 正答率(トレーニング) = 0.09
                : 490. 正答率(テスト) = 0.1135
Generation: 500. 正答率(トレーニング) = 0.14
                : 500. 正答率(テスト) = 0.1135
Generation: 510. 正答率(トレーニング) = 0.11
                : 510. 正答率(テスト) = 0.1135
Generation: 520. 正答率(トレーニング) = 0.13
                : 520. 正答率(テスト) = 0.1135
Generation: 530. 正答率(トレーニング) = 0.12
                : 530. 正答率(テスト) = 0.098
Generation: 540. 正答率(トレーニング) = 0.08
                : 540. 正答率(テスト) = 0.098
Generation: 550. 正答率(トレーニング) = 0.14
                : 550. 正答率(テスト) = 0.0974
Generation: 560. 正答率(トレーニング) = 0.07
                : 560. 正答率(テスト) = 0.0974
Generation: 570. 正答率(トレーニング) = 0.08
                : 570. 正答率(テスト) = 0.101
Generation: 580. 正答率(トレーニング) = 0.1
                : 580. 正答率(テスト) = 0.101
Generation: 590. 正答率(トレーニング) = 0.1
                : 590. 正答率(テスト) = 0.1028
Generation: 600. 正答率(トレーニング) = 0.1
                : 600. 正答率(テスト) = 0.1135
Generation: 610. 正答率(トレーニング) = 0.15
                : 610. 正答率(テスト) = 0.1135
Generation: 620. 正答率(トレーニング) = 0.13
                : 620. 正答率(テスト) = 0.1135
Generation: 630. 正答率(トレーニング) = 0.13
                : 630. 正答率(テスト) = 0.1135
Generation: 640. 正答率(トレーニング) = 0.11
                : 640. 正答率(テスト) = 0.1028
Generation: 650. 正答率(トレーニング) = 0.1
                : 650. 正答率(テスト) = 0.1028
Generation: 660. 正答率(トレーニング) = 0.11
                : 660. 正答率(テスト) = 0.1028
Generation: 670. 正答率(トレーニング) = 0.1
                : 670. 正答率(テスト) = 0.1135
Generation: 680. 正答率(トレーニング) = 0.17
                : 680. 正答率(テスト) = 0.1135
Generation: 690. 正答率(トレーニング) = 0.11
                : 690. 正答率(テスト) = 0.1135
Generation: 700. 正答率(トレーニング) = 0.06
                : 700. 正答率(テスト) = 0.1009
Generation: 710. 正答率(トレーニング) = 0.13
                : 710. 正答率(テスト) = 0.1135
Generation: 720. 正答率(トレーニング) = 0.17
                : 720. 正答率(テスト) = 0.1135
Generation: 730. 正答率(トレーニング) = 0.11
                : 730. 正答率(テスト) = 0.1135
Generation: 740. 正答率(トレーニング) = 0.1
                : 740. 正答率(テスト) = 0.1135
Generation: 750. 正答率(トレーニング) = 0.09
                : 750. 正答率(テスト) = 0.1135
Generation: 760. 正答率(トレーニング) = 0.09
                : 760. 正答率(テスト) = 0.1135
Generation: 770. 正答率(トレーニング) = 0.15
                : 770. 正答率(テスト) = 0.1135
Generation: 780. 正答率(トレーニング) = 0.09
                : 780. 正答率(テスト) = 0.1135
Generation: 790. 正答率(トレーニング) = 0.09
                : 790. 正答率(テスト) = 0.1135
Generation: 800. 正答率(トレーニング) = 0.15
                : 800. 正答率(テスト) = 0.1135
Generation: 810. 正答率(トレーニング) = 0.08
                : 810. 正答率(テスト) = 0.1135
Generation: 820. 正答率(トレーニング) = 0.12
                : 820. 正答率(テスト) = 0.1135
Generation: 830. 正答率(トレーニング) = 0.09
                : 830. 正答率(テスト) = 0.1135
Generation: 840. 正答率(トレーニング) = 0.12
                : 840. 正答率(テスト) = 0.1135
Generation: 850. 正答率(トレーニング) = 0.06
                : 850. 正答率(テスト) = 0.1135
Generation: 860. 正答率(トレーニング) = 0.09
                : 860. 正答率(テスト) = 0.1135
Generation: 870. 正答率(トレーニング) = 0.1
                : 870. 正答率(テスト) = 0.1135
Generation: 880. 正答率(トレーニング) = 0.09
                : 880. 正答率(テスト) = 0.1135
Generation: 890. 正答率(トレーニング) = 0.08
                : 890. 正答率(テスト) = 0.1135
Generation: 900. 正答率(トレーニング) = 0.08
                : 900. 正答率(テスト) = 0.1135
Generation: 910. 正答率(トレーニング) = 0.07
                : 910. 正答率(テスト) = 0.1135
Generation: 920. 正答率(トレーニング) = 0.09
                : 920. 正答率(テスト) = 0.1028
Generation: 930. 正答率(トレーニング) = 0.09
                : 930. 正答率(テスト) = 0.1028
Generation: 940. 正答率(トレーニング) = 0.1
                : 940. 正答率(テスト) = 0.1135
Generation: 950. 正答率(トレーニング) = 0.13
                : 950. 正答率(テスト) = 0.1135
Generation: 960. 正答率(トレーニング) = 0.14
                : 960. 正答率(テスト) = 0.1135
Generation: 970. 正答率(トレーニング) = 0.04
                : 970. 正答率(テスト) = 0.1135
Generation: 980. 正答率(トレーニング) = 0.11
                : 980. 正答率(テスト) = 0.0982
Generation: 990. 正答率(トレーニング) = 0.15
                : 990. 正答率(テスト) = 0.0974
Generation: 1000. 正答率(トレーニング) = 0.1
                : 1000. 正答率(テスト) = 0.1028

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1043122/d1b07657-baf3-abdc-4b3b-261407cdd03b.png)


RSMprop

```python

# データの読み込み
(x_train, d_train), (x_test, d_test) = load_mnist(normalize=True, one_hot_label=True)

print("データ読み込み完了")

# batch_normalizationの設定 ================================
# use_batchnorm = True
use_batchnorm = False
# ====================================================

network = MultiLayerNet(input_size=784, hidden_size_list=[40, 20], output_size=10, activation='sigmoid', weight_init_std=0.01,
                       use_batchnorm=use_batchnorm)

iters_num = 1000
train_size = x_train.shape[0]
batch_size = 100
learning_rate = 0.01
decay_rate = 0.99

train_loss_list = []
accuracies_train = []
accuracies_test = []

plot_interval=10

for i in range(iters_num):
    batch_mask = np.random.choice(train_size, batch_size)
    x_batch = x_train[batch_mask]
    d_batch = d_train[batch_mask]

    # 勾配
    grad = network.gradient(x_batch, d_batch)
    if i == 0:
        h = {}
    for key in ('W1', 'W2', 'W3', 'b1', 'b2', 'b3'):
        if i == 0:
            h[key] = np.zeros_like(network.params[key])
        h[key] *= decay_rate
        h[key] += (1 - decay_rate) * np.square(grad[key])
        network.params[key] -= learning_rate * grad[key] / (np.sqrt(h[key]) + 1e-7)

        loss = network.loss(x_batch, d_batch)
        train_loss_list.append(loss)                
        
    if (i + 1) % plot_interval == 0:
        accr_test = network.accuracy(x_test, d_test)
        accuracies_test.append(accr_test)        
        accr_train = network.accuracy(x_batch, d_batch)
        accuracies_train.append(accr_train)
        
        print('Generation: ' + str(i+1) + '. 正答率(トレーニング) = ' + str(accr_train))
        print('                : ' + str(i+1) + '. 正答率(テスト) = ' + str(accr_test))
        
        
lists = range(0, iters_num, plot_interval)
plt.plot(lists, accuracies_train, label="training set")
plt.plot(lists, accuracies_test,  label="test set")
plt.legend(loc="lower right")
plt.title("accuracy")
plt.xlabel("count")
plt.ylabel("accuracy")
plt.ylim(0, 1.0)
# グラフの表示
plt.show()
```

>データ読み込み完了
Generation: 10. 正答率(トレーニング) = 0.14
                : 10. 正答率(テスト) = 0.0974
Generation: 20. 正答率(トレーニング) = 0.16
                : 20. 正答率(テスト) = 0.1135
Generation: 30. 正答率(トレーニング) = 0.26
                : 30. 正答率(テスト) = 0.2011
Generation: 40. 正答率(トレーニング) = 0.21
                : 40. 正答率(テスト) = 0.2256
Generation: 50. 正答率(トレーニング) = 0.22
                : 50. 正答率(テスト) = 0.1951
Generation: 60. 正答率(トレーニング) = 0.29
                : 60. 正答率(テスト) = 0.2096
Generation: 70. 正答率(トレーニング) = 0.26
                : 70. 正答率(テスト) = 0.2269
Generation: 80. 正答率(トレーニング) = 0.33
                : 80. 正答率(テスト) = 0.2765
Generation: 90. 正答率(トレーニング) = 0.29
                : 90. 正答率(テスト) = 0.2716
Generation: 100. 正答率(トレーニング) = 0.34
                : 100. 正答率(テスト) = 0.2642
Generation: 110. 正答率(トレーニング) = 0.39
                : 110. 正答率(テスト) = 0.2777
Generation: 120. 正答率(トレーニング) = 0.35
                : 120. 正答率(テスト) = 0.3652
Generation: 130. 正答率(トレーニング) = 0.42
                : 130. 正答率(テスト) = 0.3572
Generation: 140. 正答率(トレーニング) = 0.47
                : 140. 正答率(テスト) = 0.3293
Generation: 150. 正答率(トレーニング) = 0.46
                : 150. 正答率(テスト) = 0.3391
Generation: 160. 正答率(トレーニング) = 0.41
                : 160. 正答率(テスト) = 0.3855
Generation: 170. 正答率(トレーニング) = 0.42
                : 170. 正答率(テスト) = 0.3536
Generation: 180. 正答率(トレーニング) = 0.42
                : 180. 正答率(テスト) = 0.4146
Generation: 190. 正答率(トレーニング) = 0.45
                : 190. 正答率(テスト) = 0.4011
Generation: 200. 正答率(トレーニング) = 0.47
                : 200. 正答率(テスト) = 0.4658
Generation: 210. 正答率(トレーニング) = 0.5
                : 210. 正答率(テスト) = 0.5009
Generation: 220. 正答率(トレーニング) = 0.55
                : 220. 正答率(テスト) = 0.5167
Generation: 230. 正答率(トレーニング) = 0.65
                : 230. 正答率(テスト) = 0.555
Generation: 240. 正答率(トレーニング) = 0.59
                : 240. 正答率(テスト) = 0.5243
Generation: 250. 正答率(トレーニング) = 0.64
                : 250. 正答率(テスト) = 0.5536
Generation: 260. 正答率(トレーニング) = 0.72
                : 260. 正答率(テスト) = 0.613
Generation: 270. 正答率(トレーニング) = 0.59
                : 270. 正答率(テスト) = 0.6037
Generation: 280. 正答率(トレーニング) = 0.65
                : 280. 正答率(テスト) = 0.6222
Generation: 290. 正答率(トレーニング) = 0.73
                : 290. 正答率(テスト) = 0.6419
Generation: 300. 正答率(トレーニング) = 0.78
                : 300. 正答率(テスト) = 0.6671
Generation: 310. 正答率(トレーニング) = 0.67
                : 310. 正答率(テスト) = 0.672
Generation: 320. 正答率(トレーニング) = 0.7
                : 320. 正答率(テスト) = 0.69
Generation: 330. 正答率(トレーニング) = 0.8
                : 330. 正答率(テスト) = 0.7084
Generation: 340. 正答率(トレーニング) = 0.69
                : 340. 正答率(テスト) = 0.7017
Generation: 350. 正答率(トレーニング) = 0.85
                : 350. 正答率(テスト) = 0.709
Generation: 360. 正答率(トレーニング) = 0.75
                : 360. 正答率(テスト) = 0.7101
Generation: 370. 正答率(トレーニング) = 0.73
                : 370. 正答率(テスト) = 0.7262
Generation: 380. 正答率(トレーニング) = 0.83
                : 380. 正答率(テスト) = 0.737
Generation: 390. 正答率(トレーニング) = 0.72
                : 390. 正答率(テスト) = 0.7423
Generation: 400. 正答率(トレーニング) = 0.84
                : 400. 正答率(テスト) = 0.7631
Generation: 410. 正答率(トレーニング) = 0.81
                : 410. 正答率(テスト) = 0.7569
Generation: 420. 正答率(トレーニング) = 0.79
                : 420. 正答率(テスト) = 0.7594
Generation: 430. 正答率(トレーニング) = 0.83
                : 430. 正答率(テスト) = 0.7524
Generation: 440. 正答率(トレーニング) = 0.8
                : 440. 正答率(テスト) = 0.7617
Generation: 450. 正答率(トレーニング) = 0.86
                : 450. 正答率(テスト) = 0.7697
Generation: 460. 正答率(トレーニング) = 0.81
                : 460. 正答率(テスト) = 0.7714
Generation: 470. 正答率(トレーニング) = 0.9
                : 470. 正答率(テスト) = 0.8053
Generation: 480. 正答率(トレーニング) = 0.87
                : 480. 正答率(テスト) = 0.783
Generation: 490. 正答率(トレーニング) = 0.87
                : 490. 正答率(テスト) = 0.8158
Generation: 500. 正答率(トレーニング) = 0.9
                : 500. 正答率(テスト) = 0.8073
Generation: 510. 正答率(トレーニング) = 0.86
                : 510. 正答率(テスト) = 0.7981
Generation: 520. 正答率(トレーニング) = 0.86
                : 520. 正答率(テスト) = 0.8428
Generation: 530. 正答率(トレーニング) = 0.92
                : 530. 正答率(テスト) = 0.8592
Generation: 540. 正答率(トレーニング) = 0.91
                : 540. 正答率(テスト) = 0.8618
Generation: 550. 正答率(トレーニング) = 0.88
                : 550. 正答率(テスト) = 0.8673
Generation: 560. 正答率(トレーニング) = 0.91
                : 560. 正答率(テスト) = 0.8797
Generation: 570. 正答率(トレーニング) = 0.93
                : 570. 正答率(テスト) = 0.8865
Generation: 580. 正答率(トレーニング) = 0.89
                : 580. 正答率(テスト) = 0.8686
Generation: 590. 正答率(トレーニング) = 0.92
                : 590. 正答率(テスト) = 0.88
Generation: 600. 正答率(トレーニング) = 0.95
                : 600. 正答率(テスト) = 0.8943
Generation: 610. 正答率(トレーニング) = 0.98
                : 610. 正答率(テスト) = 0.8884
Generation: 620. 正答率(トレーニング) = 0.92
                : 620. 正答率(テスト) = 0.8898
Generation: 630. 正答率(トレーニング) = 0.91
                : 630. 正答率(テスト) = 0.8936
Generation: 640. 正答率(トレーニング) = 0.94
                : 640. 正答率(テスト) = 0.8915
Generation: 650. 正答率(トレーニング) = 0.98
                : 650. 正答率(テスト) = 0.8939
Generation: 660. 正答率(トレーニング) = 0.93
                : 660. 正答率(テスト) = 0.898
Generation: 670. 正答率(トレーニング) = 0.94
                : 670. 正答率(テスト) = 0.9009
Generation: 680. 正答率(トレーニング) = 0.91
                : 680. 正答率(テスト) = 0.9021
Generation: 690. 正答率(トレーニング) = 0.95
                : 690. 正答率(テスト) = 0.8925
Generation: 700. 正答率(トレーニング) = 0.96
                : 700. 正答率(テスト) = 0.902
Generation: 710. 正答率(トレーニング) = 0.96
                : 710. 正答率(テスト) = 0.894
Generation: 720. 正答率(トレーニング) = 0.94
                : 720. 正答率(テスト) = 0.9058
Generation: 730. 正答率(トレーニング) = 0.96
                : 730. 正答率(テスト) = 0.9057
Generation: 740. 正答率(トレーニング) = 0.96
                : 740. 正答率(テスト) = 0.9074
Generation: 750. 正答率(トレーニング) = 0.91
                : 750. 正答率(テスト) = 0.9083
Generation: 760. 正答率(トレーニング) = 0.96
                : 760. 正答率(テスト) = 0.9018
Generation: 770. 正答率(トレーニング) = 0.94
                : 770. 正答率(テスト) = 0.906
Generation: 780. 正答率(トレーニング) = 0.94
                : 780. 正答率(テスト) = 0.9051
Generation: 790. 正答率(トレーニング) = 0.95
                : 790. 正答率(テスト) = 0.9101
Generation: 800. 正答率(トレーニング) = 0.95
                : 800. 正答率(テスト) = 0.9111
Generation: 810. 正答率(トレーニング) = 0.97
                : 810. 正答率(テスト) = 0.9109
Generation: 820. 正答率(トレーニング) = 0.98
                : 820. 正答率(テスト) = 0.9089
Generation: 830. 正答率(トレーニング) = 0.97
                : 830. 正答率(テスト) = 0.9146
Generation: 840. 正答率(トレーニング) = 0.93
                : 840. 正答率(テスト) = 0.9088
Generation: 850. 正答率(トレーニング) = 0.93
                : 850. 正答率(テスト) = 0.9097
Generation: 860. 正答率(トレーニング) = 0.95
                : 860. 正答率(テスト) = 0.9188
Generation: 870. 正答率(トレーニング) = 0.92
                : 870. 正答率(テスト) = 0.9159
Generation: 880. 正答率(トレーニング) = 0.95
                : 880. 正答率(テスト) = 0.9011
Generation: 890. 正答率(トレーニング) = 0.96
                : 890. 正答率(テスト) = 0.9121
Generation: 900. 正答率(トレーニング) = 0.94
                : 900. 正答率(テスト) = 0.9135
Generation: 910. 正答率(トレーニング) = 0.96
                : 910. 正答率(テスト) = 0.9172
Generation: 920. 正答率(トレーニング) = 0.95
                : 920. 正答率(テスト) = 0.9168
Generation: 930. 正答率(トレーニング) = 0.95
                : 930. 正答率(テスト) = 0.9195
Generation: 940. 正答率(トレーニング) = 0.97
                : 940. 正答率(テスト) = 0.9123
Generation: 950. 正答率(トレーニング) = 0.95
                : 950. 正答率(テスト) = 0.9204
Generation: 960. 正答率(トレーニング) = 0.98
                : 960. 正答率(テスト) = 0.9194
Generation: 970. 正答率(トレーニング) = 0.93
                : 970. 正答率(テスト) = 0.9222
Generation: 980. 正答率(トレーニング) = 0.97
                : 980. 正答率(テスト) = 0.913
Generation: 990. 正答率(トレーニング) = 0.98
                : 990. 正答率(テスト) = 0.9153
Generation: 1000. 正答率(トレーニング) = 0.95
                : 1000. 正答率(テスト) = 0.9201

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1043122/044db27a-a918-993e-5a8c-78b4992150fc.png)


Adam

```python

# データの読み込み
(x_train, d_train), (x_test, d_test) = load_mnist(normalize=True, one_hot_label=True)

print("データ読み込み完了")

# batch_normalizationの設定 ================================
# use_batchnorm = True
use_batchnorm = False
# ====================================================

network = MultiLayerNet(input_size=784, hidden_size_list=[40, 20], output_size=10, activation='sigmoid', weight_init_std=0.01,
                       use_batchnorm=use_batchnorm)

iters_num = 1000
train_size = x_train.shape[0]
batch_size = 100
learning_rate = 0.01
beta1 = 0.9
beta2 = 0.999

train_loss_list = []
accuracies_train = []
accuracies_test = []

plot_interval=10

for i in range(iters_num):
    batch_mask = np.random.choice(train_size, batch_size)
    x_batch = x_train[batch_mask]
    d_batch = d_train[batch_mask]

    # 勾配
    grad = network.gradient(x_batch, d_batch)
    if i == 0:
        m = {}
        v = {}
    learning_rate_t  = learning_rate * np.sqrt(1.0 - beta2 ** (i + 1)) / (1.0 - beta1 ** (i + 1))    
    for key in ('W1', 'W2', 'W3', 'b1', 'b2', 'b3'):
        if i == 0:
            m[key] = np.zeros_like(network.params[key])
            v[key] = np.zeros_like(network.params[key])
            
        m[key] += (1 - beta1) * (grad[key] - m[key])
        v[key] += (1 - beta2) * (grad[key] ** 2 - v[key])            
        network.params[key] -= learning_rate_t * m[key] / (np.sqrt(v[key]) + 1e-7)                
        
        
    if (i + 1) % plot_interval == 0:
        accr_test = network.accuracy(x_test, d_test)
        accuracies_test.append(accr_test)        
        accr_train = network.accuracy(x_batch, d_batch)
        accuracies_train.append(accr_train)
        loss = network.loss(x_batch, d_batch)
        train_loss_list.append(loss)        
        
        print('Generation: ' + str(i+1) + '. 正答率(トレーニング) = ' + str(accr_train))
        print('                : ' + str(i+1) + '. 正答率(テスト) = ' + str(accr_test))
                

lists = range(0, iters_num, plot_interval)
plt.plot(lists, accuracies_train, label="training set")
plt.plot(lists, accuracies_test,  label="test set")
plt.legend(loc="lower right")
plt.title("accuracy")
plt.xlabel("count")
plt.ylabel("accuracy")
plt.ylim(0, 1.0)
# グラフの表示
plt.show()

```

>データ読み込み完了
Generation: 10. 正答率(トレーニング) = 0.11
                : 10. 正答率(テスト) = 0.1032
Generation: 20. 正答率(トレーニング) = 0.15
                : 20. 正答率(テスト) = 0.103
Generation: 30. 正答率(トレーニング) = 0.14
                : 30. 正答率(テスト) = 0.13
Generation: 40. 正答率(トレーニング) = 0.22
                : 40. 正答率(テスト) = 0.1984
Generation: 50. 正答率(トレーニング) = 0.26
                : 50. 正答率(テスト) = 0.21
Generation: 60. 正答率(トレーニング) = 0.22
                : 60. 正答率(テスト) = 0.2081
Generation: 70. 正答率(トレーニング) = 0.21
                : 70. 正答率(テスト) = 0.2107
Generation: 80. 正答率(トレーニング) = 0.18
                : 80. 正答率(テスト) = 0.2091
Generation: 90. 正答率(トレーニング) = 0.39
                : 90. 正答率(テスト) = 0.3012
Generation: 100. 正答率(トレーニング) = 0.24
                : 100. 正答率(テスト) = 0.3054
Generation: 110. 正答率(トレーニング) = 0.47
                : 110. 正答率(テスト) = 0.4917
Generation: 120. 正答率(トレーニング) = 0.51
                : 120. 正答率(テスト) = 0.5231
Generation: 130. 正答率(トレーニング) = 0.49
                : 130. 正答率(テスト) = 0.5004
Generation: 140. 正答率(トレーニング) = 0.61
                : 140. 正答率(テスト) = 0.571
Generation: 150. 正答率(トレーニング) = 0.68
                : 150. 正答率(テスト) = 0.5938
Generation: 160. 正答率(トレーニング) = 0.67
                : 160. 正答率(テスト) = 0.6098
Generation: 170. 正答率(トレーニング) = 0.6
                : 170. 正答率(テスト) = 0.638
Generation: 180. 正答率(トレーニング) = 0.68
                : 180. 正答率(テスト) = 0.6611
Generation: 190. 正答率(トレーニング) = 0.67
                : 190. 正答率(テスト) = 0.6924
Generation: 200. 正答率(トレーニング) = 0.66
                : 200. 正答率(テスト) = 0.6987
Generation: 210. 正答率(トレーニング) = 0.67
                : 210. 正答率(テスト) = 0.7141
Generation: 220. 正答率(トレーニング) = 0.71
                : 220. 正答率(テスト) = 0.7334
Generation: 230. 正答率(トレーニング) = 0.75
                : 230. 正答率(テスト) = 0.7485
Generation: 240. 正答率(トレーニング) = 0.78
                : 240. 正答率(テスト) = 0.7872
Generation: 250. 正答率(トレーニング) = 0.77
                : 250. 正答率(テスト) = 0.7946
Generation: 260. 正答率(トレーニング) = 0.78
                : 260. 正答率(テスト) = 0.8054
Generation: 270. 正答率(トレーニング) = 0.86
                : 270. 正答率(テスト) = 0.8447
Generation: 280. 正答率(トレーニング) = 0.87
                : 280. 正答率(テスト) = 0.8527
Generation: 290. 正答率(トレーニング) = 0.85
                : 290. 正答率(テスト) = 0.8516
Generation: 300. 正答率(トレーニング) = 0.78
                : 300. 正答率(テスト) = 0.8719
Generation: 310. 正答率(トレーニング) = 0.92
                : 310. 正答率(テスト) = 0.896
Generation: 320. 正答率(トレーニング) = 0.9
                : 320. 正答率(テスト) = 0.9013
Generation: 330. 正答率(トレーニング) = 0.93
                : 330. 正答率(テスト) = 0.9074
Generation: 340. 正答率(トレーニング) = 0.92
                : 340. 正答率(テスト) = 0.911
Generation: 350. 正答率(トレーニング) = 0.94
                : 350. 正答率(テスト) = 0.9114
Generation: 360. 正答率(トレーニング) = 0.97
                : 360. 正答率(テスト) = 0.9153
Generation: 370. 正答率(トレーニング) = 0.94
                : 370. 正答率(テスト) = 0.9161
Generation: 380. 正答率(トレーニング) = 0.91
                : 380. 正答率(テスト) = 0.9152
Generation: 390. 正答率(トレーニング) = 0.93
                : 390. 正答率(テスト) = 0.9175
Generation: 400. 正答率(トレーニング) = 0.97
                : 400. 正答率(テスト) = 0.9216
Generation: 410. 正答率(トレーニング) = 0.95
                : 410. 正答率(テスト) = 0.9253
Generation: 420. 正答率(トレーニング) = 0.95
                : 420. 正答率(テスト) = 0.9227
Generation: 430. 正答率(トレーニング) = 0.98
                : 430. 正答率(テスト) = 0.9268
Generation: 440. 正答率(トレーニング) = 0.92
                : 440. 正答率(テスト) = 0.9251
Generation: 450. 正答率(トレーニング) = 0.93
                : 450. 正答率(テスト) = 0.9212
Generation: 460. 正答率(トレーニング) = 0.96
                : 460. 正答率(テスト) = 0.9189
Generation: 470. 正答率(トレーニング) = 0.93
                : 470. 正答率(テスト) = 0.9308
Generation: 480. 正答率(トレーニング) = 0.95
                : 480. 正答率(テスト) = 0.9335
Generation: 490. 正答率(トレーニング) = 0.94
                : 490. 正答率(テスト) = 0.9351
Generation: 500. 正答率(トレーニング) = 0.94
                : 500. 正答率(テスト) = 0.9355
Generation: 510. 正答率(トレーニング) = 0.98
                : 510. 正答率(テスト) = 0.934
Generation: 520. 正答率(トレーニング) = 0.95
                : 520. 正答率(テスト) = 0.9323
Generation: 530. 正答率(トレーニング) = 0.89
                : 530. 正答率(テスト) = 0.9345
Generation: 540. 正答率(トレーニング) = 0.96
                : 540. 正答率(テスト) = 0.9301
Generation: 550. 正答率(トレーニング) = 0.98
                : 550. 正答率(テスト) = 0.9312
Generation: 560. 正答率(トレーニング) = 0.94
                : 560. 正答率(テスト) = 0.9312
Generation: 570. 正答率(トレーニング) = 0.98
                : 570. 正答率(テスト) = 0.9325
Generation: 580. 正答率(トレーニング) = 0.92
                : 580. 正答率(テスト) = 0.9336
Generation: 590. 正答率(トレーニング) = 0.97
                : 590. 正答率(テスト) = 0.9292
Generation: 600. 正答率(トレーニング) = 0.94
                : 600. 正答率(テスト) = 0.9291
Generation: 610. 正答率(トレーニング) = 0.96
                : 610. 正答率(テスト) = 0.9312
Generation: 620. 正答率(トレーニング) = 0.94
                : 620. 正答率(テスト) = 0.935
Generation: 630. 正答率(トレーニング) = 0.99
                : 630. 正答率(テスト) = 0.9349
Generation: 640. 正答率(トレーニング) = 0.95
                : 640. 正答率(テスト) = 0.9405
Generation: 650. 正答率(トレーニング) = 0.96
                : 650. 正答率(テスト) = 0.9371
Generation: 660. 正答率(トレーニング) = 0.96
                : 660. 正答率(テスト) = 0.938
Generation: 670. 正答率(トレーニング) = 0.96
                : 670. 正答率(テスト) = 0.9366
Generation: 680. 正答率(トレーニング) = 0.94
                : 680. 正答率(テスト) = 0.9351
Generation: 690. 正答率(トレーニング) = 0.96
                : 690. 正答率(テスト) = 0.9421
Generation: 700. 正答率(トレーニング) = 0.96
                : 700. 正答率(テスト) = 0.9434
Generation: 710. 正答率(トレーニング) = 0.93
                : 710. 正答率(テスト) = 0.9408
Generation: 720. 正答率(トレーニング) = 0.96
                : 720. 正答率(テスト) = 0.9376
Generation: 730. 正答率(トレーニング) = 0.97
                : 730. 正答率(テスト) = 0.9442
Generation: 740. 正答率(トレーニング) = 0.94
                : 740. 正答率(テスト) = 0.9413
Generation: 750. 正答率(トレーニング) = 0.94
                : 750. 正答率(テスト) = 0.943
Generation: 760. 正答率(トレーニング) = 0.96
                : 760. 正答率(テスト) = 0.9425
Generation: 770. 正答率(トレーニング) = 0.97
                : 770. 正答率(テスト) = 0.9383
Generation: 780. 正答率(トレーニング) = 0.93
                : 780. 正答率(テスト) = 0.9418
Generation: 790. 正答率(トレーニング) = 0.96
                : 790. 正答率(テスト) = 0.9466
Generation: 800. 正答率(トレーニング) = 0.91
                : 800. 正答率(テスト) = 0.9372
Generation: 810. 正答率(トレーニング) = 0.92
                : 810. 正答率(テスト) = 0.9448
Generation: 820. 正答率(トレーニング) = 0.94
                : 820. 正答率(テスト) = 0.9398
Generation: 830. 正答率(トレーニング) = 0.92
                : 830. 正答率(テスト) = 0.9452
Generation: 840. 正答率(トレーニング) = 0.98
                : 840. 正答率(テスト) = 0.9492
Generation: 850. 正答率(トレーニング) = 0.98
                : 850. 正答率(テスト) = 0.9495
Generation: 860. 正答率(トレーニング) = 0.96
                : 860. 正答率(テスト) = 0.9484
Generation: 870. 正答率(トレーニング) = 0.92
                : 870. 正答率(テスト) = 0.9434
Generation: 880. 正答率(トレーニング) = 0.94
                : 880. 正答率(テスト) = 0.9448
Generation: 890. 正答率(トレーニング) = 0.98
                : 890. 正答率(テスト) = 0.9461
Generation: 900. 正答率(トレーニング) = 0.98
                : 900. 正答率(テスト) = 0.9469
Generation: 910. 正答率(トレーニング) = 0.98
                : 910. 正答率(テスト) = 0.9427
Generation: 920. 正答率(トレーニング) = 0.98
                : 920. 正答率(テスト) = 0.9454
Generation: 930. 正答率(トレーニング) = 0.97
                : 930. 正答率(テスト) = 0.948
Generation: 940. 正答率(トレーニング) = 0.97
                : 940. 正答率(テスト) = 0.9446
Generation: 950. 正答率(トレーニング) = 0.95
                : 950. 正答率(テスト) = 0.9421
Generation: 960. 正答率(トレーニング) = 0.99
                : 960. 正答率(テスト) = 0.9476
Generation: 970. 正答率(トレーニング) = 0.93
                : 970. 正答率(テスト) = 0.9436
Generation: 980. 正答率(トレーニング) = 0.98
                : 980. 正答率(テスト) = 0.9498
Generation: 990. 正答率(トレーニング) = 1.0
                : 990. 正答率(テスト) = 0.9506
Generation: 1000. 正答率(トレーニング) = 0.95
                : 1000. 正答率(テスト) = 0.9469

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1043122/d4c61632-647b-c62d-8808-e7d0f2812c41.png)


## 3. 過学習
確認テスト：機械学習で使われる線形モデル（線形回帰、主成分分析…etc）の正則化は、モデルの重みを制限することで可能となる。
前述の線形モデルの正則化手法の中にリッジ回帰という手法があり、その特徴として正しいものを選択しなさい
（a）ハイパーパラメータを大きな値に設定すると、すべての重みが限りなく0に近づく
（b）ハイパーパラメータを0に設定すると、非線形回帰となる
（c）バイアス項についても、正則化される
（d）リッジ回帰の場合、隠れ層に対して正則化項を加える

→(a)


過学習の原因
重みが大きい値をとることで、過学習が発生することがある。
学習させていくと、重みにばらつきが発生する。重みが大きい値は、学習において重要な値であり、重みが大きいと過学習が起こる

過学習の解決策
誤差に対して、正則化項を加算することで、重みを抑制する。過学習がおこりそうな重みの大きさ以下で重みをコントロールし、かつ重みの大きさにばらつきを出す必要がある。

```math
\begin{eqnarray}
L_p=\|x \|_p =\left(|x_1|^p+| x_2 |^p+| x_3 |^p+\cdots +| x_n|^p\right)^{\frac{1}{p}}=\left(\sum_{i=1}^n|x_i|^p\right)^{\frac{1}{p}}
\end{eqnarray}

```

$p=1$のとき、$L_1$正則化
$p=2$のとき、$L_2$正則化
$\lambda$は減衰させるスケーリングのための値。

```math
\begin{eqnarray}
E_n(w)+\frac{1}{p}\lambda \|x\|_p
\end{eqnarray}

```

確認テスト
下図について、L1正則化を表しているグラフはどちらか答えよ。
→右の図（Lasso）

ドロップアウト
過学習の課題⇒ノードの数が多い。
ランダムにノードを削除して学習させる→ドロップアウト
メリットとして、データ量を変化させずに、異なるモデルを学習させていると解釈できる。


実装
overfiting

```python
import numpy as np
from collections import OrderedDict
from common import layers
from data.mnist import load_mnist
import matplotlib.pyplot as plt
from multi_layer_net import MultiLayerNet
from common import optimizer


(x_train, d_train), (x_test, d_test) = load_mnist(normalize=True)

print("データ読み込み完了")

# 過学習を再現するために、学習データを削減
x_train = x_train[:300]
d_train = d_train[:300]

network = MultiLayerNet(input_size=784, hidden_size_list=[100, 100, 100, 100, 100, 100], output_size=10)
optimizer = optimizer.SGD(learning_rate=0.01)

iters_num = 1000
train_size = x_train.shape[0]
batch_size = 100

train_loss_list = []
accuracies_train = []
accuracies_test = []

plot_interval=10


for i in range(iters_num):
    batch_mask = np.random.choice(train_size, batch_size)
    x_batch = x_train[batch_mask]
    d_batch = d_train[batch_mask]

    grad = network.gradient(x_batch, d_batch)
    optimizer.update(network.params, grad)

    loss = network.loss(x_batch, d_batch)
    train_loss_list.append(loss)
        
    if (i+1) % plot_interval == 0:
        accr_train = network.accuracy(x_train, d_train)
        accr_test = network.accuracy(x_test, d_test)
        accuracies_train.append(accr_train)
        accuracies_test.append(accr_test)

        print('Generation: ' + str(i+1) + '. 正答率(トレーニング) = ' + str(accr_train))
        print('                : ' + str(i+1) + '. 正答率(テスト) = ' + str(accr_test))        

lists = range(0, iters_num, plot_interval)
plt.plot(lists, accuracies_train, label="training set")
plt.plot(lists, accuracies_test,  label="test set")
plt.legend(loc="lower right")
plt.title("accuracy")
plt.xlabel("count")
plt.ylabel("accuracy")
plt.ylim(0, 1.0)
# グラフの表示
plt.show()
```

>データ読み込み完了
Generation: 10. 正答率(トレーニング) = 0.17333333333333334
                : 10. 正答率(テスト) = 0.1541
Generation: 20. 正答率(トレーニング) = 0.27
                : 20. 正答率(テスト) = 0.2088
Generation: 30. 正答率(トレーニング) = 0.3566666666666667
                : 30. 正答率(テスト) = 0.2765
Generation: 40. 正答率(トレーニング) = 0.39
                : 40. 正答率(テスト) = 0.3143
Generation: 50. 正答率(トレーニング) = 0.43
                : 50. 正答率(テスト) = 0.3533
Generation: 60. 正答率(トレーニング) = 0.4766666666666667
                : 60. 正答率(テスト) = 0.3959
Generation: 70. 正答率(トレーニング) = 0.55
                : 70. 正答率(テスト) = 0.46
Generation: 80. 正答率(トレーニング) = 0.6166666666666667
                : 80. 正答率(テスト) = 0.5037
Generation: 90. 正答率(トレーニング) = 0.6666666666666666
                : 90. 正答率(テスト) = 0.5421
Generation: 100. 正答率(トレーニング) = 0.6933333333333334
                : 100. 正答率(テスト) = 0.565
Generation: 110. 正答率(トレーニング) = 0.75
                : 110. 正答率(テスト) = 0.5872
Generation: 120. 正答率(トレーニング) = 0.8066666666666666
                : 120. 正答率(テスト) = 0.6226
Generation: 130. 正答率(トレーニング) = 0.8433333333333334
                : 130. 正答率(テスト) = 0.6319
Generation: 140. 正答率(トレーニング) = 0.87
                : 140. 正答率(テスト) = 0.6512
Generation: 150. 正答率(トレーニング) = 0.89
                : 150. 正答率(テスト) = 0.6705
Generation: 160. 正答率(トレーニング) = 0.9
                : 160. 正答率(テスト) = 0.6849
Generation: 170. 正答率(トレーニング) = 0.9066666666666666
                : 170. 正答率(テスト) = 0.6858
Generation: 180. 正答率(トレーニング) = 0.9266666666666666
                : 180. 正答率(テスト) = 0.6997
Generation: 190. 正答率(トレーニング) = 0.95
                : 190. 正答率(テスト) = 0.7206
Generation: 200. 正答率(トレーニング) = 0.96
                : 200. 正答率(テスト) = 0.7308
Generation: 210. 正答率(トレーニング) = 0.9633333333333334
                : 210. 正答率(テスト) = 0.7315
Generation: 220. 正答率(トレーニング) = 0.9666666666666667
                : 220. 正答率(テスト) = 0.7368
Generation: 230. 正答率(トレーニング) = 0.96
                : 230. 正答率(テスト) = 0.7379
Generation: 240. 正答率(トレーニング) = 0.97
                : 240. 正答率(テスト) = 0.7412
Generation: 250. 正答率(トレーニング) = 0.97
                : 250. 正答率(テスト) = 0.7468
Generation: 260. 正答率(トレーニング) = 0.97
                : 260. 正答率(テスト) = 0.751
Generation: 270. 正答率(トレーニング) = 0.9733333333333334
                : 270. 正答率(テスト) = 0.7512
Generation: 280. 正答率(トレーニング) = 0.9733333333333334
                : 280. 正答率(テスト) = 0.7574
Generation: 290. 正答率(トレーニング) = 0.9733333333333334
                : 290. 正答率(テスト) = 0.7621
Generation: 300. 正答率(トレーニング) = 0.98
                : 300. 正答率(テスト) = 0.7585
Generation: 310. 正答率(トレーニング) = 0.98
                : 310. 正答率(テスト) = 0.7685
Generation: 320. 正答率(トレーニング) = 0.9833333333333333
                : 320. 正答率(テスト) = 0.7635
Generation: 330. 正答率(トレーニング) = 0.9866666666666667
                : 330. 正答率(テスト) = 0.7659
Generation: 340. 正答率(トレーニング) = 0.99
                : 340. 正答率(テスト) = 0.7651
Generation: 350. 正答率(トレーニング) = 0.99
                : 350. 正答率(テスト) = 0.7658
Generation: 360. 正答率(トレーニング) = 0.9933333333333333
                : 360. 正答率(テスト) = 0.7742
Generation: 370. 正答率(トレーニング) = 0.9933333333333333
                : 370. 正答率(テスト) = 0.7693
Generation: 380. 正答率(トレーニング) = 1.0
                : 380. 正答率(テスト) = 0.7749
Generation: 390. 正答率(トレーニング) = 0.9966666666666667
                : 390. 正答率(テスト) = 0.7684
Generation: 400. 正答率(トレーニング) = 1.0
                : 400. 正答率(テスト) = 0.7721
Generation: 410. 正答率(トレーニング) = 1.0
                : 410. 正答率(テスト) = 0.7728
Generation: 420. 正答率(トレーニング) = 1.0
                : 420. 正答率(テスト) = 0.7707
Generation: 430. 正答率(トレーニング) = 1.0
                : 430. 正答率(テスト) = 0.7768
Generation: 440. 正答率(トレーニング) = 1.0
                : 440. 正答率(テスト) = 0.7768
Generation: 450. 正答率(トレーニング) = 1.0
                : 450. 正答率(テスト) = 0.779
Generation: 460. 正答率(トレーニング) = 1.0
                : 460. 正答率(テスト) = 0.7766
Generation: 470. 正答率(トレーニング) = 1.0
                : 470. 正答率(テスト) = 0.7782
Generation: 480. 正答率(トレーニング) = 1.0
                : 480. 正答率(テスト) = 0.7806
Generation: 490. 正答率(トレーニング) = 1.0
                : 490. 正答率(テスト) = 0.7814
Generation: 500. 正答率(トレーニング) = 1.0
                : 500. 正答率(テスト) = 0.7778
Generation: 510. 正答率(トレーニング) = 1.0
                : 510. 正答率(テスト) = 0.779
Generation: 520. 正答率(トレーニング) = 1.0
                : 520. 正答率(テスト) = 0.7783
Generation: 530. 正答率(トレーニング) = 1.0
                : 530. 正答率(テスト) = 0.7801
Generation: 540. 正答率(トレーニング) = 1.0
                : 540. 正答率(テスト) = 0.7766
Generation: 550. 正答率(トレーニング) = 1.0
                : 550. 正答率(テスト) = 0.778
Generation: 560. 正答率(トレーニング) = 1.0
                : 560. 正答率(テスト) = 0.7817
Generation: 570. 正答率(トレーニング) = 1.0
                : 570. 正答率(テスト) = 0.779
Generation: 580. 正答率(トレーニング) = 1.0
                : 580. 正答率(テスト) = 0.7791
Generation: 590. 正答率(トレーニング) = 1.0
                : 590. 正答率(テスト) = 0.7827
Generation: 600. 正答率(トレーニング) = 1.0
                : 600. 正答率(テスト) = 0.7824
Generation: 610. 正答率(トレーニング) = 1.0
                : 610. 正答率(テスト) = 0.7793
Generation: 620. 正答率(トレーニング) = 1.0
                : 620. 正答率(テスト) = 0.7831
Generation: 630. 正答率(トレーニング) = 1.0
                : 630. 正答率(テスト) = 0.7825
Generation: 640. 正答率(トレーニング) = 1.0
                : 640. 正答率(テスト) = 0.7809
Generation: 650. 正答率(トレーニング) = 1.0
                : 650. 正答率(テスト) = 0.7818
Generation: 660. 正答率(トレーニング) = 1.0
                : 660. 正答率(テスト) = 0.7845
Generation: 670. 正答率(トレーニング) = 1.0
                : 670. 正答率(テスト) = 0.781
Generation: 680. 正答率(トレーニング) = 1.0
                : 680. 正答率(テスト) = 0.7831
Generation: 690. 正答率(トレーニング) = 1.0
                : 690. 正答率(テスト) = 0.7839
Generation: 700. 正答率(トレーニング) = 1.0
                : 700. 正答率(テスト) = 0.7818
Generation: 710. 正答率(トレーニング) = 1.0
                : 710. 正答率(テスト) = 0.7834
Generation: 720. 正答率(トレーニング) = 1.0
                : 720. 正答率(テスト) = 0.7835
Generation: 730. 正答率(トレーニング) = 1.0
                : 730. 正答率(テスト) = 0.7821
Generation: 740. 正答率(トレーニング) = 1.0
                : 740. 正答率(テスト) = 0.7836
Generation: 750. 正答率(トレーニング) = 1.0
                : 750. 正答率(テスト) = 0.783
Generation: 760. 正答率(トレーニング) = 1.0
                : 760. 正答率(テスト) = 0.7836
Generation: 770. 正答率(トレーニング) = 1.0
                : 770. 正答率(テスト) = 0.7828
Generation: 780. 正答率(トレーニング) = 1.0
                : 780. 正答率(テスト) = 0.7837
Generation: 790. 正答率(トレーニング) = 1.0
                : 790. 正答率(テスト) = 0.7837
Generation: 800. 正答率(トレーニング) = 1.0
                : 800. 正答率(テスト) = 0.7823
Generation: 810. 正答率(トレーニング) = 1.0
                : 810. 正答率(テスト) = 0.7826
Generation: 820. 正答率(トレーニング) = 1.0
                : 820. 正答率(テスト) = 0.7844
Generation: 830. 正答率(トレーニング) = 1.0
                : 830. 正答率(テスト) = 0.7829
Generation: 840. 正答率(トレーニング) = 1.0
                : 840. 正答率(テスト) = 0.7828
Generation: 850. 正答率(トレーニング) = 1.0
                : 850. 正答率(テスト) = 0.7834
Generation: 860. 正答率(トレーニング) = 1.0
                : 860. 正答率(テスト) = 0.783
Generation: 870. 正答率(トレーニング) = 1.0
                : 870. 正答率(テスト) = 0.7828
Generation: 880. 正答率(トレーニング) = 1.0
                : 880. 正答率(テスト) = 0.7835
Generation: 890. 正答率(トレーニング) = 1.0
                : 890. 正答率(テスト) = 0.7861
Generation: 900. 正答率(トレーニング) = 1.0
                : 900. 正答率(テスト) = 0.7837
Generation: 910. 正答率(トレーニング) = 1.0
                : 910. 正答率(テスト) = 0.7845
Generation: 920. 正答率(トレーニング) = 1.0
                : 920. 正答率(テスト) = 0.7848
Generation: 930. 正答率(トレーニング) = 1.0
                : 930. 正答率(テスト) = 0.7853
Generation: 940. 正答率(トレーニング) = 1.0
                : 940. 正答率(テスト) = 0.7846
Generation: 950. 正答率(トレーニング) = 1.0
                : 950. 正答率(テスト) = 0.7849
Generation: 960. 正答率(トレーニング) = 1.0
                : 960. 正答率(テスト) = 0.7844
Generation: 970. 正答率(トレーニング) = 1.0
                : 970. 正答率(テスト) = 0.7849
Generation: 980. 正答率(トレーニング) = 1.0
                : 980. 正答率(テスト) = 0.7837
Generation: 990. 正答率(トレーニング) = 1.0
                : 990. 正答率(テスト) = 0.7833
Generation: 1000. 正答率(トレーニング) = 1.0
                : 1000. 正答率(テスト) = 0.7851

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1043122/bc1f41e8-6cb0-788f-0733-de2472c1d2d8.png)

過学習が起きていることがわかる

L2


```python
from common import optimizer

(x_train, d_train), (x_test, d_test) = load_mnist(normalize=True)

print("データ読み込み完了")

# 過学習を再現するために、学習データを削減
x_train = x_train[:300]
d_train = d_train[:300]


network = MultiLayerNet(input_size=784, hidden_size_list=[100, 100, 100, 100, 100, 100], output_size=10)


iters_num = 1000
train_size = x_train.shape[0]
batch_size = 100
learning_rate=0.01

train_loss_list = []
accuracies_train = []
accuracies_test = []

plot_interval=10
hidden_layer_num = network.hidden_layer_num

# 正則化強度設定 ======================================
weight_decay_lambda = 0.1
# =================================================

for i in range(iters_num):
    batch_mask = np.random.choice(train_size, batch_size)
    x_batch = x_train[batch_mask]
    d_batch = d_train[batch_mask]

    grad = network.gradient(x_batch, d_batch)
    weight_decay = 0
    
    for idx in range(1, hidden_layer_num+1):
        grad['W' + str(idx)] = network.layers['Affine' + str(idx)].dW + weight_decay_lambda * network.params['W' + str(idx)]
        grad['b' + str(idx)] = network.layers['Affine' + str(idx)].db
        network.params['W' + str(idx)] -= learning_rate * grad['W' + str(idx)]
        network.params['b' + str(idx)] -= learning_rate * grad['b' + str(idx)]        
        weight_decay += 0.5 * weight_decay_lambda * np.sqrt(np.sum(network.params['W' + str(idx)] ** 2))

    loss = network.loss(x_batch, d_batch) + weight_decay
    train_loss_list.append(loss)        
        
    if (i+1) % plot_interval == 0:
        accr_train = network.accuracy(x_train, d_train)
        accr_test = network.accuracy(x_test, d_test)
        accuracies_train.append(accr_train)
        accuracies_test.append(accr_test)
        
        print('Generation: ' + str(i+1) + '. 正答率(トレーニング) = ' + str(accr_train))
        print('                : ' + str(i+1) + '. 正答率(テスト) = ' + str(accr_test))               


lists = range(0, iters_num, plot_interval)
plt.plot(lists, accuracies_train, label="training set")
plt.plot(lists, accuracies_test,  label="test set")
plt.legend(loc="lower right")
plt.title("accuracy")
plt.xlabel("count")
plt.ylabel("accuracy")
plt.ylim(0, 1.0)
# グラフの表示
plt.show()
```

>データ読み込み完了
Generation: 10. 正答率(トレーニング) = 0.15333333333333332
                : 10. 正答率(テスト) = 0.1281
Generation: 20. 正答率(トレーニング) = 0.22666666666666666
                : 20. 正答率(テスト) = 0.1735
Generation: 30. 正答率(トレーニング) = 0.32
                : 30. 正答率(テスト) = 0.221
Generation: 40. 正答率(トレーニング) = 0.38333333333333336
                : 40. 正答率(テスト) = 0.2494
Generation: 50. 正答率(トレーニング) = 0.4166666666666667
                : 50. 正答率(テスト) = 0.2707
Generation: 60. 正答率(トレーニング) = 0.4533333333333333
                : 60. 正答率(テスト) = 0.3059
Generation: 70. 正答率(トレーニング) = 0.48
                : 70. 正答率(テスト) = 0.3286
Generation: 80. 正答率(トレーニング) = 0.4766666666666667
                : 80. 正答率(テスト) = 0.3406
Generation: 90. 正答率(トレーニング) = 0.4766666666666667
                : 90. 正答率(テスト) = 0.3512
Generation: 100. 正答率(トレーニング) = 0.48333333333333334
                : 100. 正答率(テスト) = 0.3606
Generation: 110. 正答率(トレーニング) = 0.49333333333333335
                : 110. 正答率(テスト) = 0.378
Generation: 120. 正答率(トレーニング) = 0.5
                : 120. 正答率(テスト) = 0.3868
Generation: 130. 正答率(トレーニング) = 0.48333333333333334
                : 130. 正答率(テスト) = 0.3908
Generation: 140. 正答率(トレーニング) = 0.5066666666666667
                : 140. 正答率(テスト) = 0.4084
Generation: 150. 正答率(トレーニング) = 0.52
                : 150. 正答率(テスト) = 0.4296
Generation: 160. 正答率(トレーニング) = 0.5366666666666666
                : 160. 正答率(テスト) = 0.4449
Generation: 170. 正答率(トレーニング) = 0.55
                : 170. 正答率(テスト) = 0.4559
Generation: 180. 正答率(トレーニング) = 0.5433333333333333
                : 180. 正答率(テスト) = 0.4468
Generation: 190. 正答率(トレーニング) = 0.5566666666666666
                : 190. 正答率(テスト) = 0.4671
Generation: 200. 正答率(トレーニング) = 0.57
                : 200. 正答率(テスト) = 0.4839
Generation: 210. 正答率(トレーニング) = 0.5866666666666667
                : 210. 正答率(テスト) = 0.4941
Generation: 220. 正答率(トレーニング) = 0.6266666666666667
                : 220. 正答率(テスト) = 0.526
Generation: 230. 正答率(トレーニング) = 0.67
                : 230. 正答率(テスト) = 0.5506
Generation: 240. 正答率(トレーニング) = 0.6533333333333333
                : 240. 正答率(テスト) = 0.5405
Generation: 250. 正答率(トレーニング) = 0.6733333333333333
                : 250. 正答率(テスト) = 0.5608
Generation: 260. 正答率(トレーニング) = 0.6966666666666667
                : 260. 正答率(テスト) = 0.5706
Generation: 270. 正答率(トレーニング) = 0.71
                : 270. 正答率(テスト) = 0.5877
Generation: 280. 正答率(トレーニング) = 0.7266666666666667
                : 280. 正答率(テスト) = 0.588
Generation: 290. 正答率(トレーニング) = 0.7766666666666666
                : 290. 正答率(テスト) = 0.6202
Generation: 300. 正答率(トレーニング) = 0.7533333333333333
                : 300. 正答率(テスト) = 0.6111
Generation: 310. 正答率(トレーニング) = 0.7933333333333333
                : 310. 正答率(テスト) = 0.6333
Generation: 320. 正答率(トレーニング) = 0.81
                : 320. 正答率(テスト) = 0.6483
Generation: 330. 正答率(トレーニング) = 0.8266666666666667
                : 330. 正答率(テスト) = 0.6635
Generation: 340. 正答率(トレーニング) = 0.83
                : 340. 正答率(テスト) = 0.6589
Generation: 350. 正答率(トレーニング) = 0.8233333333333334
                : 350. 正答率(テスト) = 0.6754
Generation: 360. 正答率(トレーニング) = 0.8166666666666667
                : 360. 正答率(テスト) = 0.6699
Generation: 370. 正答率(トレーニング) = 0.8233333333333334
                : 370. 正答率(テスト) = 0.6726
Generation: 380. 正答率(トレーニング) = 0.8233333333333334
                : 380. 正答率(テスト) = 0.6686
Generation: 390. 正答率(トレーニング) = 0.8333333333333334
                : 390. 正答率(テスト) = 0.6925
Generation: 400. 正答率(トレーニング) = 0.8466666666666667
                : 400. 正答率(テスト) = 0.6919
Generation: 410. 正答率(トレーニング) = 0.85
                : 410. 正答率(テスト) = 0.696
Generation: 420. 正答率(トレーニング) = 0.8566666666666667
                : 420. 正答率(テスト) = 0.707
Generation: 430. 正答率(トレーニング) = 0.8666666666666667
                : 430. 正答率(テスト) = 0.7092
Generation: 440. 正答率(トレーニング) = 0.8733333333333333
                : 440. 正答率(テスト) = 0.7051
Generation: 450. 正答率(トレーニング) = 0.8733333333333333
                : 450. 正答率(テスト) = 0.7161
Generation: 460. 正答率(トレーニング) = 0.87
                : 460. 正答率(テスト) = 0.719
Generation: 470. 正答率(トレーニング) = 0.8633333333333333
                : 470. 正答率(テスト) = 0.7159
Generation: 480. 正答率(トレーニング) = 0.8766666666666667
                : 480. 正答率(テスト) = 0.7214
Generation: 490. 正答率(トレーニング) = 0.8733333333333333
                : 490. 正答率(テスト) = 0.7154
Generation: 500. 正答率(トレーニング) = 0.8733333333333333
                : 500. 正答率(テスト) = 0.716
Generation: 510. 正答率(トレーニング) = 0.8733333333333333
                : 510. 正答率(テスト) = 0.7235
Generation: 520. 正答率(トレーニング) = 0.8733333333333333
                : 520. 正答率(テスト) = 0.718
Generation: 530. 正答率(トレーニング) = 0.88
                : 530. 正答率(テスト) = 0.7212
Generation: 540. 正答率(トレーニング) = 0.8666666666666667
                : 540. 正答率(テスト) = 0.7166
Generation: 550. 正答率(トレーニング) = 0.88
                : 550. 正答率(テスト) = 0.7233
Generation: 560. 正答率(トレーニング) = 0.8733333333333333
                : 560. 正答率(テスト) = 0.7253
Generation: 570. 正答率(トレーニング) = 0.88
                : 570. 正答率(テスト) = 0.7224
Generation: 580. 正答率(トレーニング) = 0.8733333333333333
                : 580. 正答率(テスト) = 0.7292
Generation: 590. 正答率(トレーニング) = 0.8766666666666667
                : 590. 正答率(テスト) = 0.7263
Generation: 600. 正答率(トレーニング) = 0.8833333333333333
                : 600. 正答率(テスト) = 0.7306
Generation: 610. 正答率(トレーニング) = 0.8833333333333333
                : 610. 正答率(テスト) = 0.7331
Generation: 620. 正答率(トレーニング) = 0.89
                : 620. 正答率(テスト) = 0.732
Generation: 630. 正答率(トレーニング) = 0.89
                : 630. 正答率(テスト) = 0.726
Generation: 640. 正答率(トレーニング) = 0.8733333333333333
                : 640. 正答率(テスト) = 0.726
Generation: 650. 正答率(トレーニング) = 0.8866666666666667
                : 650. 正答率(テスト) = 0.7317
Generation: 660. 正答率(トレーニング) = 0.88
                : 660. 正答率(テスト) = 0.7214
Generation: 670. 正答率(トレーニング) = 0.8866666666666667
                : 670. 正答率(テスト) = 0.7296
Generation: 680. 正答率(トレーニング) = 0.8866666666666667
                : 680. 正答率(テスト) = 0.7383
Generation: 690. 正答率(トレーニング) = 0.8866666666666667
                : 690. 正答率(テスト) = 0.7343
Generation: 700. 正答率(トレーニング) = 0.8833333333333333
                : 700. 正答率(テスト) = 0.7321
Generation: 710. 正答率(トレーニング) = 0.8866666666666667
                : 710. 正答率(テスト) = 0.7341
Generation: 720. 正答率(トレーニング) = 0.8866666666666667
                : 720. 正答率(テスト) = 0.7285
Generation: 730. 正答率(トレーニング) = 0.8933333333333333
                : 730. 正答率(テスト) = 0.7357
Generation: 740. 正答率(トレーニング) = 0.8866666666666667
                : 740. 正答率(テスト) = 0.7311
Generation: 750. 正答率(トレーニング) = 0.8933333333333333
                : 750. 正答率(テスト) = 0.734
Generation: 760. 正答率(トレーニング) = 0.8933333333333333
                : 760. 正答率(テスト) = 0.7359
Generation: 770. 正答率(トレーニング) = 0.9033333333333333
                : 770. 正答率(テスト) = 0.7347
Generation: 780. 正答率(トレーニング) = 0.8833333333333333
                : 780. 正答率(テスト) = 0.7256
Generation: 790. 正答率(トレーニング) = 0.8833333333333333
                : 790. 正答率(テスト) = 0.7348
Generation: 800. 正答率(トレーニング) = 0.8966666666666666
                : 800. 正答率(テスト) = 0.735
Generation: 810. 正答率(トレーニング) = 0.9066666666666666
                : 810. 正答率(テスト) = 0.7367
Generation: 820. 正答率(トレーニング) = 0.91
                : 820. 正答率(テスト) = 0.7358
Generation: 830. 正答率(トレーニング) = 0.8933333333333333
                : 830. 正答率(テスト) = 0.7333
Generation: 840. 正答率(トレーニング) = 0.9
                : 840. 正答率(テスト) = 0.733
Generation: 850. 正答率(トレーニング) = 0.8933333333333333
                : 850. 正答率(テスト) = 0.735
Generation: 860. 正答率(トレーニング) = 0.9
                : 860. 正答率(テスト) = 0.7369
Generation: 870. 正答率(トレーニング) = 0.9
                : 870. 正答率(テスト) = 0.7328
Generation: 880. 正答率(トレーニング) = 0.8866666666666667
                : 880. 正答率(テスト) = 0.7297
Generation: 890. 正答率(トレーニング) = 0.89
                : 890. 正答率(テスト) = 0.7327
Generation: 900. 正答率(トレーニング) = 0.9
                : 900. 正答率(テスト) = 0.7329
Generation: 910. 正答率(トレーニング) = 0.89
                : 910. 正答率(テスト) = 0.7335
Generation: 920. 正答率(トレーニング) = 0.9
                : 920. 正答率(テスト) = 0.7302
Generation: 930. 正答率(トレーニング) = 0.9066666666666666
                : 930. 正答率(テスト) = 0.7337
Generation: 940. 正答率(トレーニング) = 0.9066666666666666
                : 940. 正答率(テスト) = 0.7361
Generation: 950. 正答率(トレーニング) = 0.8966666666666666
                : 950. 正答率(テスト) = 0.7329
Generation: 960. 正答率(トレーニング) = 0.89
                : 960. 正答率(テスト) = 0.7335
Generation: 970. 正答率(トレーニング) = 0.8966666666666666
                : 970. 正答率(テスト) = 0.7393
Generation: 980. 正答率(トレーニング) = 0.9
                : 980. 正答率(テスト) = 0.7296
Generation: 990. 正答率(トレーニング) = 0.9066666666666666
                : 990. 正答率(テスト) = 0.7313
Generation: 1000. 正答率(トレーニング) = 0.9
                : 1000. 正答率(テスト) = 0.7333

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1043122/b2d3e998-f689-3706-0c6f-e8bb55a613c0.png)


L1


```python
(x_train, d_train), (x_test, d_test) = load_mnist(normalize=True)

print("データ読み込み完了")

# 過学習を再現するために、学習データを削減
x_train = x_train[:300]
d_train = d_train[:300]

network = MultiLayerNet(input_size=784, hidden_size_list=[100, 100, 100, 100, 100, 100], output_size=10)


iters_num = 1000
train_size = x_train.shape[0]
batch_size = 100
learning_rate=0.1

train_loss_list = []
accuracies_train = []
accuracies_test = []

plot_interval=10
hidden_layer_num = network.hidden_layer_num

# 正則化強度設定 ======================================
weight_decay_lambda = 0.005
# =================================================

for i in range(iters_num):
    batch_mask = np.random.choice(train_size, batch_size)
    x_batch = x_train[batch_mask]
    d_batch = d_train[batch_mask]

    grad = network.gradient(x_batch, d_batch)
    weight_decay = 0
    
    for idx in range(1, hidden_layer_num+1):
        grad['W' + str(idx)] = network.layers['Affine' + str(idx)].dW + weight_decay_lambda * np.sign(network.params['W' + str(idx)])
        grad['b' + str(idx)] = network.layers['Affine' + str(idx)].db
        network.params['W' + str(idx)] -= learning_rate * grad['W' + str(idx)]
        network.params['b' + str(idx)] -= learning_rate * grad['b' + str(idx)]        
        weight_decay += weight_decay_lambda * np.sum(np.abs(network.params['W' + str(idx)]))

    loss = network.loss(x_batch, d_batch) + weight_decay
    train_loss_list.append(loss)        
        
    if (i+1) % plot_interval == 0:
        accr_train = network.accuracy(x_train, d_train)
        accr_test = network.accuracy(x_test, d_test)
        accuracies_train.append(accr_train)
        accuracies_test.append(accr_test)
        
        print('Generation: ' + str(i+1) + '. 正答率(トレーニング) = ' + str(accr_train))
        print('                : ' + str(i+1) + '. 正答率(テスト) = ' + str(accr_test))               
                
lists = range(0, iters_num, plot_interval)
plt.plot(lists, accuracies_train, label="training set")
plt.plot(lists, accuracies_test,  label="test set")
plt.legend(loc="lower right")
plt.title("accuracy")
plt.xlabel("count")
plt.ylabel("accuracy")
plt.ylim(0, 1.0)
# グラフの表示
plt.show()
```

>データ読み込み完了
Generation: 10. 正答率(トレーニング) = 0.4266666666666667
                : 10. 正答率(テスト) = 0.37
Generation: 20. 正答率(トレーニング) = 0.61
                : 20. 正答率(テスト) = 0.4812
Generation: 30. 正答率(トレーニング) = 0.6466666666666666
                : 30. 正答率(テスト) = 0.5415
Generation: 40. 正答率(トレーニング) = 0.7566666666666667
                : 40. 正答率(テスト) = 0.5888
Generation: 50. 正答率(トレーニング) = 0.8366666666666667
                : 50. 正答率(テスト) = 0.6861
Generation: 60. 正答率(トレーニング) = 0.8833333333333333
                : 60. 正答率(テスト) = 0.702
Generation: 70. 正答率(トレーニング) = 0.91
                : 70. 正答率(テスト) = 0.705
Generation: 80. 正答率(トレーニング) = 0.7
                : 80. 正答率(テスト) = 0.507
Generation: 90. 正答率(トレーニング) = 0.9266666666666666
                : 90. 正答率(テスト) = 0.716
Generation: 100. 正答率(トレーニング) = 0.8766666666666667
                : 100. 正答率(テスト) = 0.696
Generation: 110. 正答率(トレーニング) = 0.82
                : 110. 正答率(テスト) = 0.6086
Generation: 120. 正答率(トレーニング) = 0.6466666666666666
                : 120. 正答率(テスト) = 0.5302
Generation: 130. 正答率(トレーニング) = 0.73
                : 130. 正答率(テスト) = 0.5541
Generation: 140. 正答率(トレーニング) = 0.8866666666666667
                : 140. 正答率(テスト) = 0.6722
Generation: 150. 正答率(トレーニング) = 0.8333333333333334
                : 150. 正答率(テスト) = 0.6424
Generation: 160. 正答率(トレーニング) = 0.5633333333333334
                : 160. 正答率(テスト) = 0.4622
Generation: 170. 正答率(トレーニング) = 0.9266666666666666
                : 170. 正答率(テスト) = 0.7304
Generation: 180. 正答率(トレーニング) = 0.88
                : 180. 正答率(テスト) = 0.684
Generation: 190. 正答率(トレーニング) = 0.8533333333333334
                : 190. 正答率(テスト) = 0.6701
Generation: 200. 正答率(トレーニング) = 0.58
                : 200. 正答率(テスト) = 0.4648
Generation: 210. 正答率(トレーニング) = 0.8466666666666667
                : 210. 正答率(テスト) = 0.6705
Generation: 220. 正答率(トレーニング) = 0.75
                : 220. 正答率(テスト) = 0.5882
Generation: 230. 正答率(トレーニング) = 0.8833333333333333
                : 230. 正答率(テスト) = 0.6892
Generation: 240. 正答率(トレーニング) = 0.8566666666666667
                : 240. 正答率(テスト) = 0.6612
Generation: 250. 正答率(トレーニング) = 0.63
                : 250. 正答率(テスト) = 0.5048
Generation: 260. 正答率(トレーニング) = 0.8766666666666667
                : 260. 正答率(テスト) = 0.6965
Generation: 270. 正答率(トレーニング) = 0.86
                : 270. 正答率(テスト) = 0.6514
Generation: 280. 正答率(トレーニング) = 0.92
                : 280. 正答率(テスト) = 0.7145
Generation: 290. 正答率(トレーニング) = 0.8233333333333334
                : 290. 正答率(テスト) = 0.6443
Generation: 300. 正答率(トレーニング) = 0.88
                : 300. 正答率(テスト) = 0.6863
Generation: 310. 正答率(トレーニング) = 0.8333333333333334
                : 310. 正答率(テスト) = 0.644
Generation: 320. 正答率(トレーニング) = 0.9066666666666666
                : 320. 正答率(テスト) = 0.6852
Generation: 330. 正答率(トレーニング) = 0.8833333333333333
                : 330. 正答率(テスト) = 0.6615
Generation: 340. 正答率(トレーニング) = 0.92
                : 340. 正答率(テスト) = 0.7158
Generation: 350. 正答率(トレーニング) = 0.9366666666666666
                : 350. 正答率(テスト) = 0.7183
Generation: 360. 正答率(トレーニング) = 0.9266666666666666
                : 360. 正答率(テスト) = 0.7204
Generation: 370. 正答率(トレーニング) = 0.8233333333333334
                : 370. 正答率(テスト) = 0.6466
Generation: 380. 正答率(トレーニング) = 0.72
                : 380. 正答率(テスト) = 0.5562
Generation: 390. 正答率(トレーニング) = 0.9366666666666666
                : 390. 正答率(テスト) = 0.7204
Generation: 400. 正答率(トレーニング) = 0.9133333333333333
                : 400. 正答率(テスト) = 0.6897
Generation: 410. 正答率(トレーニング) = 0.9233333333333333
                : 410. 正答率(テスト) = 0.7105
Generation: 420. 正答率(トレーニング) = 0.9266666666666666
                : 420. 正答率(テスト) = 0.7047
Generation: 430. 正答率(トレーニング) = 0.89
                : 430. 正答率(テスト) = 0.6907
Generation: 440. 正答率(トレーニング) = 0.81
                : 440. 正答率(テスト) = 0.6514
Generation: 450. 正答率(トレーニング) = 0.6366666666666667
                : 450. 正答率(テスト) = 0.53
Generation: 460. 正答率(トレーニング) = 0.9166666666666666
                : 460. 正答率(テスト) = 0.6824
Generation: 470. 正答率(トレーニング) = 0.9133333333333333
                : 470. 正答率(テスト) = 0.7085
Generation: 480. 正答率(トレーニング) = 0.9533333333333334
                : 480. 正答率(テスト) = 0.7198
Generation: 490. 正答率(トレーニング) = 0.9333333333333333
                : 490. 正答率(テスト) = 0.6995
Generation: 500. 正答率(トレーニング) = 0.7066666666666667
                : 500. 正答率(テスト) = 0.5491
Generation: 510. 正答率(トレーニング) = 0.81
                : 510. 正答率(テスト) = 0.6392
Generation: 520. 正答率(トレーニング) = 0.9566666666666667
                : 520. 正答率(テスト) = 0.7269
Generation: 530. 正答率(トレーニング) = 0.9066666666666666
                : 530. 正答率(テスト) = 0.6982
Generation: 540. 正答率(トレーニング) = 0.9066666666666666
                : 540. 正答率(テスト) = 0.6884
Generation: 550. 正答率(トレーニング) = 0.9733333333333334
                : 550. 正答率(テスト) = 0.7298
Generation: 560. 正答率(トレーニング) = 0.91
                : 560. 正答率(テスト) = 0.6769
Generation: 570. 正答率(トレーニング) = 0.96
                : 570. 正答率(テスト) = 0.7257
Generation: 580. 正答率(トレーニング) = 0.9566666666666667
                : 580. 正答率(テスト) = 0.7223
Generation: 590. 正答率(トレーニング) = 0.82
                : 590. 正答率(テスト) = 0.6079
Generation: 600. 正答率(トレーニング) = 0.9633333333333334
                : 600. 正答率(テスト) = 0.7293
Generation: 610. 正答率(トレーニング) = 0.65
                : 610. 正答率(テスト) = 0.5124
Generation: 620. 正答率(トレーニング) = 0.9666666666666667
                : 620. 正答率(テスト) = 0.7284
Generation: 630. 正答率(トレーニング) = 0.9666666666666667
                : 630. 正答率(テスト) = 0.7342
Generation: 640. 正答率(トレーニング) = 0.9333333333333333
                : 640. 正答率(テスト) = 0.6984
Generation: 650. 正答率(トレーニング) = 0.97
                : 650. 正答率(テスト) = 0.7293
Generation: 660. 正答率(トレーニング) = 0.9733333333333334
                : 660. 正答率(テスト) = 0.727
Generation: 670. 正答率(トレーニング) = 0.7333333333333333
                : 670. 正答率(テスト) = 0.5682
Generation: 680. 正答率(トレーニング) = 0.94
                : 680. 正答率(テスト) = 0.6727
Generation: 690. 正答率(トレーニング) = 0.43333333333333335
                : 690. 正答率(テスト) = 0.3466
Generation: 700. 正答率(トレーニング) = 0.9633333333333334
                : 700. 正答率(テスト) = 0.705
Generation: 710. 正答率(トレーニング) = 0.9466666666666667
                : 710. 正答率(テスト) = 0.6994
Generation: 720. 正答率(トレーニング) = 0.9466666666666667
                : 720. 正答率(テスト) = 0.7144
Generation: 730. 正答率(トレーニング) = 0.9433333333333334
                : 730. 正答率(テスト) = 0.6912
Generation: 740. 正答率(トレーニング) = 0.9766666666666667
                : 740. 正答率(テスト) = 0.7093
Generation: 750. 正答率(トレーニング) = 0.98
                : 750. 正答率(テスト) = 0.7123
Generation: 760. 正答率(トレーニング) = 0.7566666666666667
                : 760. 正答率(テスト) = 0.5526
Generation: 770. 正答率(トレーニング) = 0.8266666666666667
                : 770. 正答率(テスト) = 0.6456
Generation: 780. 正答率(トレーニング) = 0.9833333333333333
                : 780. 正答率(テスト) = 0.7313
Generation: 790. 正答率(トレーニング) = 0.9833333333333333
                : 790. 正答率(テスト) = 0.7381
Generation: 800. 正答率(トレーニング) = 0.9866666666666667
                : 800. 正答率(テスト) = 0.7252
Generation: 810. 正答率(トレーニング) = 0.8266666666666667
                : 810. 正答率(テスト) = 0.5924
Generation: 820. 正答率(トレーニング) = 0.9833333333333333
                : 820. 正答率(テスト) = 0.7291
Generation: 830. 正答率(トレーニング) = 0.8833333333333333
                : 830. 正答率(テスト) = 0.6739
Generation: 840. 正答率(トレーニング) = 0.9866666666666667
                : 840. 正答率(テスト) = 0.7361
Generation: 850. 正答率(トレーニング) = 0.9833333333333333
                : 850. 正答率(テスト) = 0.729
Generation: 860. 正答率(トレーニング) = 0.9633333333333334
                : 860. 正答率(テスト) = 0.713
Generation: 870. 正答率(トレーニング) = 0.5766666666666667
                : 870. 正答率(テスト) = 0.4165
Generation: 880. 正答率(トレーニング) = 0.98
                : 880. 正答率(テスト) = 0.7257
Generation: 890. 正答率(トレーニング) = 0.9866666666666667
                : 890. 正答率(テスト) = 0.7253
Generation: 900. 正答率(トレーニング) = 0.9866666666666667
                : 900. 正答率(テスト) = 0.7159
Generation: 910. 正答率(トレーニング) = 0.51
                : 910. 正答率(テスト) = 0.444
Generation: 920. 正答率(トレーニング) = 0.74
                : 920. 正答率(テスト) = 0.5768
Generation: 930. 正答率(トレーニング) = 0.91
                : 930. 正答率(テスト) = 0.6596
Generation: 940. 正答率(トレーニング) = 0.7766666666666666
                : 940. 正答率(テスト) = 0.5644
Generation: 950. 正答率(トレーニング) = 0.9433333333333334
                : 950. 正答率(テスト) = 0.6958
Generation: 960. 正答率(トレーニング) = 0.7666666666666667
                : 960. 正答率(テスト) = 0.5861
Generation: 970. 正答率(トレーニング) = 0.9766666666666667
                : 970. 正答率(テスト) = 0.7238
Generation: 980. 正答率(トレーニング) = 0.9866666666666667
                : 980. 正答率(テスト) = 0.7183
Generation: 990. 正答率(トレーニング) = 0.7466666666666667
                : 990. 正答率(テスト) = 0.5906
Generation: 1000. 正答率(トレーニング) = 0.99
                : 1000. 正答率(テスト) = 0.7215


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1043122/491a428f-437d-d03d-05c0-3247c6be1a71.png)


Dropout


```python
class Dropout:
    def __init__(self, dropout_ratio=0.5):
        self.dropout_ratio = dropout_ratio
        self.mask = None

    def forward(self, x, train_flg=True):
        if train_flg:
            self.mask = np.random.rand(*x.shape) > self.dropout_ratio
            return x * self.mask
        else:
            return x * (1.0 - self.dropout_ratio)

    def backward(self, dout):
        return dout * self.mask
```


```python
from common import optimizer
(x_train, d_train), (x_test, d_test) = load_mnist(normalize=True)

print("データ読み込み完了")

# 過学習を再現するために、学習データを削減
x_train = x_train[:300]
d_train = d_train[:300]

# ドロップアウト設定 ======================================
use_dropout = True
dropout_ratio = 0.15
# ====================================================

network = MultiLayerNet(input_size=784, hidden_size_list=[100, 100, 100, 100, 100, 100], output_size=10,
                        weight_decay_lambda=weight_decay_lambda, use_dropout = use_dropout, dropout_ratio = dropout_ratio)
optimizer = optimizer.SGD(learning_rate=0.01)
# optimizer = optimizer.Momentum(learning_rate=0.01, momentum=0.9)
# optimizer = optimizer.AdaGrad(learning_rate=0.01)
# optimizer = optimizer.Adam()

iters_num = 1000
train_size = x_train.shape[0]
batch_size = 100

train_loss_list = []
accuracies_train = []
accuracies_test = []

plot_interval=10


for i in range(iters_num):
    batch_mask = np.random.choice(train_size, batch_size)
    x_batch = x_train[batch_mask]
    d_batch = d_train[batch_mask]

    grad = network.gradient(x_batch, d_batch)
    optimizer.update(network.params, grad)

    loss = network.loss(x_batch, d_batch)
    train_loss_list.append(loss)    
    
    if (i+1) % plot_interval == 0:
        accr_train = network.accuracy(x_train, d_train)
        accr_test = network.accuracy(x_test, d_test)
        accuracies_train.append(accr_train)
        accuracies_test.append(accr_test)

        print('Generation: ' + str(i+1) + '. 正答率(トレーニング) = ' + str(accr_train))
        print('                : ' + str(i+1) + '. 正答率(テスト) = ' + str(accr_test))        
        
lists = range(0, iters_num, plot_interval)
plt.plot(lists, accuracies_train, label="training set")
plt.plot(lists, accuracies_test,  label="test set")
plt.legend(loc="lower right")
plt.title("accuracy")
plt.xlabel("count")
plt.ylabel("accuracy")
plt.ylim(0, 1.0)
# グラフの表示
plt.show()
```

>データ読み込み完了
Generation: 10. 正答率(トレーニング) = 0.08666666666666667
                : 10. 正答率(テスト) = 0.0887
Generation: 20. 正答率(トレーニング) = 0.11
                : 20. 正答率(テスト) = 0.09
Generation: 30. 正答率(トレーニング) = 0.10333333333333333
                : 30. 正答率(テスト) = 0.0891
Generation: 40. 正答率(トレーニング) = 0.10666666666666667
                : 40. 正答率(テスト) = 0.093
Generation: 50. 正答率(トレーニング) = 0.12666666666666668
                : 50. 正答率(テスト) = 0.1005
Generation: 60. 正答率(トレーニング) = 0.16666666666666666
                : 60. 正答率(テスト) = 0.1182
Generation: 70. 正答率(トレーニング) = 0.18333333333333332
                : 70. 正答率(テスト) = 0.1328
Generation: 80. 正答率(トレーニング) = 0.21333333333333335
                : 80. 正答率(テスト) = 0.1621
Generation: 90. 正答率(トレーニング) = 0.25
                : 90. 正答率(テスト) = 0.1889
Generation: 100. 正答率(トレーニング) = 0.26666666666666666
                : 100. 正答率(テスト) = 0.206
Generation: 110. 正答率(トレーニング) = 0.2833333333333333
                : 110. 正答率(テスト) = 0.2285
Generation: 120. 正答率(トレーニング) = 0.30333333333333334
                : 120. 正答率(テスト) = 0.2523
Generation: 130. 正答率(トレーニング) = 0.31333333333333335
                : 130. 正答率(テスト) = 0.2614
Generation: 140. 正答率(トレーニング) = 0.33666666666666667
                : 140. 正答率(テスト) = 0.2721
Generation: 150. 正答率(トレーニング) = 0.36666666666666664
                : 150. 正答率(テスト) = 0.287
Generation: 160. 正答率(トレーニング) = 0.37
                : 160. 正答率(テスト) = 0.2945
Generation: 170. 正答率(トレーニング) = 0.38666666666666666
                : 170. 正答率(テスト) = 0.3016
Generation: 180. 正答率(トレーニング) = 0.3933333333333333
                : 180. 正答率(テスト) = 0.3117
Generation: 190. 正答率(トレーニング) = 0.4033333333333333
                : 190. 正答率(テスト) = 0.3184
Generation: 200. 正答率(トレーニング) = 0.4166666666666667
                : 200. 正答率(テスト) = 0.3239
Generation: 210. 正答率(トレーニング) = 0.43666666666666665
                : 210. 正答率(テスト) = 0.3345
Generation: 220. 正答率(トレーニング) = 0.4533333333333333
                : 220. 正答率(テスト) = 0.3398
Generation: 230. 正答率(トレーニング) = 0.47333333333333333
                : 230. 正答率(テスト) = 0.3499
Generation: 240. 正答率(トレーニング) = 0.4766666666666667
                : 240. 正答率(テスト) = 0.3585
Generation: 250. 正答率(トレーニング) = 0.49
                : 250. 正答率(テスト) = 0.3746
Generation: 260. 正答率(トレーニング) = 0.51
                : 260. 正答率(テスト) = 0.3908
Generation: 270. 正答率(トレーニング) = 0.5
                : 270. 正答率(テスト) = 0.3853
Generation: 280. 正答率(トレーニング) = 0.5133333333333333
                : 280. 正答率(テスト) = 0.4016
Generation: 290. 正答率(トレーニング) = 0.5366666666666666
                : 290. 正答率(テスト) = 0.4167
Generation: 300. 正答率(トレーニング) = 0.5466666666666666
                : 300. 正答率(テスト) = 0.4246
Generation: 310. 正答率(トレーニング) = 0.5633333333333334
                : 310. 正答率(テスト) = 0.429
Generation: 320. 正答率(トレーニング) = 0.5733333333333334
                : 320. 正答率(テスト) = 0.4458
Generation: 330. 正答率(トレーニング) = 0.5666666666666667
                : 330. 正答率(テスト) = 0.4421
Generation: 340. 正答率(トレーニング) = 0.5666666666666667
                : 340. 正答率(テスト) = 0.4532
Generation: 350. 正答率(トレーニング) = 0.57
                : 350. 正答率(テスト) = 0.4591
Generation: 360. 正答率(トレーニング) = 0.5766666666666667
                : 360. 正答率(テスト) = 0.4511
Generation: 370. 正答率(トレーニング) = 0.6133333333333333
                : 370. 正答率(テスト) = 0.4724
Generation: 380. 正答率(トレーニング) = 0.5966666666666667
                : 380. 正答率(テスト) = 0.4745
Generation: 390. 正答率(トレーニング) = 0.6266666666666667
                : 390. 正答率(テスト) = 0.4982
Generation: 400. 正答率(トレーニング) = 0.62
                : 400. 正答率(テスト) = 0.4942
Generation: 410. 正答率(トレーニング) = 0.6166666666666667
                : 410. 正答率(テスト) = 0.4958
Generation: 420. 正答率(トレーニング) = 0.6333333333333333
                : 420. 正答率(テスト) = 0.5095
Generation: 430. 正答率(トレーニング) = 0.62
                : 430. 正答率(テスト) = 0.5064
Generation: 440. 正答率(トレーニング) = 0.6333333333333333
                : 440. 正答率(テスト) = 0.5214
Generation: 450. 正答率(トレーニング) = 0.6366666666666667
                : 450. 正答率(テスト) = 0.5287
Generation: 460. 正答率(トレーニング) = 0.66
                : 460. 正答率(テスト) = 0.5451
Generation: 470. 正答率(トレーニング) = 0.6633333333333333
                : 470. 正答率(テスト) = 0.5508
Generation: 480. 正答率(トレーニング) = 0.6633333333333333
                : 480. 正答率(テスト) = 0.5478
Generation: 490. 正答率(トレーニング) = 0.6833333333333333
                : 490. 正答率(テスト) = 0.5597
Generation: 500. 正答率(トレーニング) = 0.6966666666666667
                : 500. 正答率(テスト) = 0.5668
Generation: 510. 正答率(トレーニング) = 0.6933333333333334
                : 510. 正答率(テスト) = 0.5669
Generation: 520. 正答率(トレーニング) = 0.7033333333333334
                : 520. 正答率(テスト) = 0.5738
Generation: 530. 正答率(トレーニング) = 0.7133333333333334
                : 530. 正答率(テスト) = 0.5851
Generation: 540. 正答率(トレーニング) = 0.7433333333333333
                : 540. 正答率(テスト) = 0.5925
Generation: 550. 正答率(トレーニング) = 0.73
                : 550. 正答率(テスト) = 0.5873
Generation: 560. 正答率(トレーニング) = 0.7333333333333333
                : 560. 正答率(テスト) = 0.5929
Generation: 570. 正答率(トレーニング) = 0.75
                : 570. 正答率(テスト) = 0.6122
Generation: 580. 正答率(トレーニング) = 0.7566666666666667
                : 580. 正答率(テスト) = 0.6149
Generation: 590. 正答率(トレーニング) = 0.7666666666666667
                : 590. 正答率(テスト) = 0.6189
Generation: 600. 正答率(トレーニング) = 0.7566666666666667
                : 600. 正答率(テスト) = 0.6143
Generation: 610. 正答率(トレーニング) = 0.7633333333333333
                : 610. 正答率(テスト) = 0.6222
Generation: 620. 正答率(トレーニング) = 0.7633333333333333
                : 620. 正答率(テスト) = 0.6289
Generation: 630. 正答率(トレーニング) = 0.7766666666666666
                : 630. 正答率(テスト) = 0.6393
Generation: 640. 正答率(トレーニング) = 0.79
                : 640. 正答率(テスト) = 0.6411
Generation: 650. 正答率(トレーニング) = 0.7866666666666666
                : 650. 正答率(テスト) = 0.637
Generation: 660. 正答率(トレーニング) = 0.8033333333333333
                : 660. 正答率(テスト) = 0.6495
Generation: 670. 正答率(トレーニング) = 0.8033333333333333
                : 670. 正答率(テスト) = 0.6473
Generation: 680. 正答率(トレーニング) = 0.8033333333333333
                : 680. 正答率(テスト) = 0.6444
Generation: 690. 正答率(トレーニング) = 0.8066666666666666
                : 690. 正答率(テスト) = 0.6508
Generation: 700. 正答率(トレーニング) = 0.8066666666666666
                : 700. 正答率(テスト) = 0.6497
Generation: 710. 正答率(トレーニング) = 0.8166666666666667
                : 710. 正答率(テスト) = 0.6501
Generation: 720. 正答率(トレーニング) = 0.8066666666666666
                : 720. 正答率(テスト) = 0.6578
Generation: 730. 正答率(トレーニング) = 0.8066666666666666
                : 730. 正答率(テスト) = 0.6583
Generation: 740. 正答率(トレーニング) = 0.81
                : 740. 正答率(テスト) = 0.6631
Generation: 750. 正答率(トレーニング) = 0.83
                : 750. 正答率(テスト) = 0.6606
Generation: 760. 正答率(トレーニング) = 0.8266666666666667
                : 760. 正答率(テスト) = 0.6684
Generation: 770. 正答率(トレーニング) = 0.8266666666666667
                : 770. 正答率(テスト) = 0.6675
Generation: 780. 正答率(トレーニング) = 0.8466666666666667
                : 780. 正答率(テスト) = 0.6692
Generation: 790. 正答率(トレーニング) = 0.8333333333333334
                : 790. 正答率(テスト) = 0.6751
Generation: 800. 正答率(トレーニング) = 0.8366666666666667
                : 800. 正答率(テスト) = 0.6757
Generation: 810. 正答率(トレーニング) = 0.85
                : 810. 正答率(テスト) = 0.6758
Generation: 820. 正答率(トレーニング) = 0.8533333333333334
                : 820. 正答率(テスト) = 0.6833
Generation: 830. 正答率(トレーニング) = 0.8733333333333333
                : 830. 正答率(テスト) = 0.6874
Generation: 840. 正答率(トレーニング) = 0.8833333333333333
                : 840. 正答率(テスト) = 0.6828
Generation: 850. 正答率(トレーニング) = 0.8733333333333333
                : 850. 正答率(テスト) = 0.6851
Generation: 860. 正答率(トレーニング) = 0.8733333333333333
                : 860. 正答率(テスト) = 0.6883
Generation: 870. 正答率(トレーニング) = 0.8766666666666667
                : 870. 正答率(テスト) = 0.6923
Generation: 880. 正答率(トレーニング) = 0.87
                : 880. 正答率(テスト) = 0.696
Generation: 890. 正答率(トレーニング) = 0.8933333333333333
                : 890. 正答率(テスト) = 0.6993
Generation: 900. 正答率(トレーニング) = 0.9
                : 900. 正答率(テスト) = 0.6977
Generation: 910. 正答率(トレーニング) = 0.8933333333333333
                : 910. 正答率(テスト) = 0.701
Generation: 920. 正答率(トレーニング) = 0.9033333333333333
                : 920. 正答率(テスト) = 0.7035
Generation: 930. 正答率(トレーニング) = 0.92
                : 930. 正答率(テスト) = 0.7079
Generation: 940. 正答率(トレーニング) = 0.9266666666666666
                : 940. 正答率(テスト) = 0.7116
Generation: 950. 正答率(トレーニング) = 0.9166666666666666
                : 950. 正答率(テスト) = 0.7104
Generation: 960. 正答率(トレーニング) = 0.91
                : 960. 正答率(テスト) = 0.7117
Generation: 970. 正答率(トレーニング) = 0.9233333333333333
                : 970. 正答率(テスト) = 0.7097
Generation: 980. 正答率(トレーニング) = 0.92
                : 980. 正答率(テスト) = 0.7173
Generation: 990. 正答率(トレーニング) = 0.9266666666666666
                : 990. 正答率(テスト) = 0.7169
Generation: 1000. 正答率(トレーニング) = 0.9266666666666666
                : 1000. 正答率(テスト) = 0.7171

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1043122/93532ee1-50e6-4613-54f9-5a4082b1e285.png)




## 4. 畳み込みニューラルネットワークの概念
畳み込み層
画像とフィルタ(カーネル)の積の総和にバイアスを加えることで算出することで特徴を抽出する。
画像の場合、縦、横、チャンネルの3次元のデータをそのまま学習し、次に伝えることができる。

パディング
画像の周囲に固定値(例えば0)を埋め込むこと。
パディングなしで畳み込みをすると元の画像より小さくなるが、パディングをすることでサイズを維持することが出来る。また、パディングなしの場合、画像の端の方は他の部分と比べて畳み込みに使われる回数が少なくなり、特徴として抽出されにくいが、パディングをすることによってより端の方も特徴を抽出できるようになる。

ストライド
フィルタをどれだけずらして畳み込みを行うかということ。

チャンネル
空間的な奥行き。例えばカラー画像の場合はRGBの3チャンネルに分けて畳み込みを行う。

プーリング層
対象領域の中から1つの値を取得する層。
畳み込んだ後に行うことでそれらしい特徴を持った値のみを抽出できる。
最大値プーリング、平均値プーリング、など

確認テスト
・サイズ6×6の入力画像を、サイズ2×2のフィルタで畳み込んだ時の出力画像のサイズを答えよ。なおストライドとパディングは1とする
→7x7

## 5. 最新のCNN
AlexNet
2012年にILSVRC（ImageNet Large Scale Visual Recognition Challenge）で優勝したモデル。
過学習を防ぐ施策
・サイズ4096の全結合層の出力にドロップアウトを使用している