準備

Googleドライブのマウント

In [ ]:
from google.colab import drive
drive.mount('/content/drive')
Mounted at /content/drive

sys.pathの設定

以下では,Googleドライブのマイドライブ直下にDNN_codeフォルダを置くことを仮定しています.必要に応じて,パスを変更してください.

In [ ]:
import sys
sys.path.append('/content/drive/My Drive/DNN_code_colab_ver200425')
sys.path.append('/content/drive/My Drive/DNN_code_colab_ver200425/lesson_2')

optimizer

SGD

In [ ]:
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='relu', weight_init_std='He',
                       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.1
                : 10. 正答率(テスト) = 0.1603
Generation: 20. 正答率(トレーニング) = 0.36
                : 20. 正答率(テスト) = 0.2765
Generation: 30. 正答率(トレーニング) = 0.35
                : 30. 正答率(テスト) = 0.3542
Generation: 40. 正答率(トレーニング) = 0.45
                : 40. 正答率(テスト) = 0.4137
Generation: 50. 正答率(トレーニング) = 0.42
                : 50. 正答率(テスト) = 0.456
Generation: 60. 正答率(トレーニング) = 0.53
                : 60. 正答率(テスト) = 0.4923
Generation: 70. 正答率(トレーニング) = 0.55
                : 70. 正答率(テスト) = 0.5244
Generation: 80. 正答率(トレーニング) = 0.6
                : 80. 正答率(テスト) = 0.5566
Generation: 90. 正答率(トレーニング) = 0.65
                : 90. 正答率(テスト) = 0.5837
Generation: 100. 正答率(トレーニング) = 0.62
                : 100. 正答率(テスト) = 0.6095
Generation: 110. 正答率(トレーニング) = 0.65
                : 110. 正答率(テスト) = 0.6276
Generation: 120. 正答率(トレーニング) = 0.63
                : 120. 正答率(テスト) = 0.6443
Generation: 130. 正答率(トレーニング) = 0.72
                : 130. 正答率(テスト) = 0.6556
Generation: 140. 正答率(トレーニング) = 0.71
                : 140. 正答率(テスト) = 0.6763
Generation: 150. 正答率(トレーニング) = 0.67
                : 150. 正答率(テスト) = 0.6916
Generation: 160. 正答率(トレーニング) = 0.77
                : 160. 正答率(テスト) = 0.7064
Generation: 170. 正答率(トレーニング) = 0.75
                : 170. 正答率(テスト) = 0.7175
Generation: 180. 正答率(トレーニング) = 0.74
                : 180. 正答率(テスト) = 0.7291
Generation: 190. 正答率(トレーニング) = 0.72
                : 190. 正答率(テスト) = 0.7359
Generation: 200. 正答率(トレーニング) = 0.83
                : 200. 正答率(テスト) = 0.7508
Generation: 210. 正答率(トレーニング) = 0.75
                : 210. 正答率(テスト) = 0.76
Generation: 220. 正答率(トレーニング) = 0.72
                : 220. 正答率(テスト) = 0.7698
Generation: 230. 正答率(トレーニング) = 0.74
                : 230. 正答率(テスト) = 0.7787
Generation: 240. 正答率(トレーニング) = 0.8
                : 240. 正答率(テスト) = 0.7864
Generation: 250. 正答率(トレーニング) = 0.79
                : 250. 正答率(テスト) = 0.7929
Generation: 260. 正答率(トレーニング) = 0.78
                : 260. 正答率(テスト) = 0.7945
Generation: 270. 正答率(トレーニング) = 0.79
                : 270. 正答率(テスト) = 0.7983
Generation: 280. 正答率(トレーニング) = 0.81
                : 280. 正答率(テスト) = 0.8055
Generation: 290. 正答率(トレーニング) = 0.79
                : 290. 正答率(テスト) = 0.8074
Generation: 300. 正答率(トレーニング) = 0.74
                : 300. 正答率(テスト) = 0.8114
Generation: 310. 正答率(トレーニング) = 0.81
                : 310. 正答率(テスト) = 0.8154
Generation: 320. 正答率(トレーニング) = 0.78
                : 320. 正答率(テスト) = 0.818
Generation: 330. 正答率(トレーニング) = 0.86
                : 330. 正答率(テスト) = 0.8239
Generation: 340. 正答率(トレーニング) = 0.87
                : 340. 正答率(テスト) = 0.8256
Generation: 350. 正答率(トレーニング) = 0.8
                : 350. 正答率(テスト) = 0.8288
Generation: 360. 正答率(トレーニング) = 0.83
                : 360. 正答率(テスト) = 0.8328
Generation: 370. 正答率(トレーニング) = 0.83
                : 370. 正答率(テスト) = 0.8371
Generation: 380. 正答率(トレーニング) = 0.82
                : 380. 正答率(テスト) = 0.8377
Generation: 390. 正答率(トレーニング) = 0.87
                : 390. 正答率(テスト) = 0.842
Generation: 400. 正答率(トレーニング) = 0.87
                : 400. 正答率(テスト) = 0.8442
Generation: 410. 正答率(トレーニング) = 0.89
                : 410. 正答率(テスト) = 0.8469
Generation: 420. 正答率(トレーニング) = 0.86
                : 420. 正答率(テスト) = 0.8501
Generation: 430. 正答率(トレーニング) = 0.92
                : 430. 正答率(テスト) = 0.8484
Generation: 440. 正答率(トレーニング) = 0.85
                : 440. 正答率(テスト) = 0.8511
Generation: 450. 正答率(トレーニング) = 0.87
                : 450. 正答率(テスト) = 0.857
Generation: 460. 正答率(トレーニング) = 0.84
                : 460. 正答率(テスト) = 0.8578
Generation: 470. 正答率(トレーニング) = 0.85
                : 470. 正答率(テスト) = 0.8589
Generation: 480. 正答率(トレーニング) = 0.87
                : 480. 正答率(テスト) = 0.8601
Generation: 490. 正答率(トレーニング) = 0.84
                : 490. 正答率(テスト) = 0.8604
Generation: 500. 正答率(トレーニング) = 0.87
                : 500. 正答率(テスト) = 0.8636
Generation: 510. 正答率(トレーニング) = 0.86
                : 510. 正答率(テスト) = 0.865
Generation: 520. 正答率(トレーニング) = 0.9
                : 520. 正答率(テスト) = 0.8667
Generation: 530. 正答率(トレーニング) = 0.91
                : 530. 正答率(テスト) = 0.8686
Generation: 540. 正答率(トレーニング) = 0.87
                : 540. 正答率(テスト) = 0.8675
Generation: 550. 正答率(トレーニング) = 0.89
                : 550. 正答率(テスト) = 0.8686
Generation: 560. 正答率(トレーニング) = 0.91
                : 560. 正答率(テスト) = 0.8706
Generation: 570. 正答率(トレーニング) = 0.82
                : 570. 正答率(テスト) = 0.8711
Generation: 580. 正答率(トレーニング) = 0.9
                : 580. 正答率(テスト) = 0.8703
Generation: 590. 正答率(トレーニング) = 0.89
                : 590. 正答率(テスト) = 0.8713
Generation: 600. 正答率(トレーニング) = 0.86
                : 600. 正答率(テスト) = 0.8746
Generation: 610. 正答率(トレーニング) = 0.87
                : 610. 正答率(テスト) = 0.8756
Generation: 620. 正答率(トレーニング) = 0.83
                : 620. 正答率(テスト) = 0.8762
Generation: 630. 正答率(トレーニング) = 0.87
                : 630. 正答率(テスト) = 0.8781
Generation: 640. 正答率(トレーニング) = 0.85
                : 640. 正答率(テスト) = 0.8789
Generation: 650. 正答率(トレーニング) = 0.9
                : 650. 正答率(テスト) = 0.8775
Generation: 660. 正答率(トレーニング) = 0.87
                : 660. 正答率(テスト) = 0.8785
Generation: 670. 正答率(トレーニング) = 0.89
                : 670. 正答率(テスト) = 0.8811
Generation: 680. 正答率(トレーニング) = 0.89
                : 680. 正答率(テスト) = 0.8841
Generation: 690. 正答率(トレーニング) = 0.92
                : 690. 正答率(テスト) = 0.8835
Generation: 700. 正答率(トレーニング) = 0.91
                : 700. 正答率(テスト) = 0.8829
Generation: 710. 正答率(トレーニング) = 0.86
                : 710. 正答率(テスト) = 0.8842
Generation: 720. 正答率(トレーニング) = 0.89
                : 720. 正答率(テスト) = 0.8838
Generation: 730. 正答率(トレーニング) = 0.91
                : 730. 正答率(テスト) = 0.8841
Generation: 740. 正答率(トレーニング) = 0.9
                : 740. 正答率(テスト) = 0.8856
Generation: 750. 正答率(トレーニング) = 0.89
                : 750. 正答率(テスト) = 0.8874
Generation: 760. 正答率(トレーニング) = 0.85
                : 760. 正答率(テスト) = 0.8863
Generation: 770. 正答率(トレーニング) = 0.87
                : 770. 正答率(テスト) = 0.8894
Generation: 780. 正答率(トレーニング) = 0.9
                : 780. 正答率(テスト) = 0.8904
Generation: 790. 正答率(トレーニング) = 0.82
                : 790. 正答率(テスト) = 0.8882
Generation: 800. 正答率(トレーニング) = 0.94
                : 800. 正答率(テスト) = 0.8913
Generation: 810. 正答率(トレーニング) = 0.86
                : 810. 正答率(テスト) = 0.8926
Generation: 820. 正答率(トレーニング) = 0.91
                : 820. 正答率(テスト) = 0.893
Generation: 830. 正答率(トレーニング) = 0.9
                : 830. 正答率(テスト) = 0.893
Generation: 840. 正答率(トレーニング) = 0.86
                : 840. 正答率(テスト) = 0.8934
Generation: 850. 正答率(トレーニング) = 0.86
                : 850. 正答率(テスト) = 0.8945
Generation: 860. 正答率(トレーニング) = 0.93
                : 860. 正答率(テスト) = 0.8944
Generation: 870. 正答率(トレーニング) = 0.85
                : 870. 正答率(テスト) = 0.8937
Generation: 880. 正答率(トレーニング) = 0.87
                : 880. 正答率(テスト) = 0.8931
Generation: 890. 正答率(トレーニング) = 0.83
                : 890. 正答率(テスト) = 0.8943
Generation: 900. 正答率(トレーニング) = 0.93
                : 900. 正答率(テスト) = 0.8947
Generation: 910. 正答率(トレーニング) = 0.89
                : 910. 正答率(テスト) = 0.8948
Generation: 920. 正答率(トレーニング) = 0.92
                : 920. 正答率(テスト) = 0.8961
Generation: 930. 正答率(トレーニング) = 0.88
                : 930. 正答率(テスト) = 0.8973
Generation: 940. 正答率(トレーニング) = 0.93
                : 940. 正答率(テスト) = 0.8972
Generation: 950. 正答率(トレーニング) = 0.94
                : 950. 正答率(テスト) = 0.8979
Generation: 960. 正答率(トレーニング) = 0.91
                : 960. 正答率(テスト) = 0.8985
Generation: 970. 正答率(トレーニング) = 0.92
                : 970. 正答率(テスト) = 0.8974
Generation: 980. 正答率(トレーニング) = 0.94
                : 980. 正答率(テスト) = 0.8996
Generation: 990. 正答率(トレーニング) = 0.9
                : 990. 正答率(テスト) = 0.8995
Generation: 1000. 正答率(トレーニング) = 0.88
                : 1000. 正答率(テスト) = 0.8998

Momentum

In [ ]:
# データの読み込み
(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='relu', weight_init_std='He',
                       use_batchnorm=use_batchnorm)

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

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.82
                : 10. 正答率(テスト) = 0.7817
Generation: 20. 正答率(トレーニング) = 0.89
                : 20. 正答率(テスト) = 0.8544
Generation: 30. 正答率(トレーニング) = 0.94
                : 30. 正答率(テスト) = 0.8864
Generation: 40. 正答率(トレーニング) = 0.91
                : 40. 正答率(テスト) = 0.8927
Generation: 50. 正答率(トレーニング) = 0.93
                : 50. 正答率(テスト) = 0.8957
Generation: 60. 正答率(トレーニング) = 0.98
                : 60. 正答率(テスト) = 0.9109
Generation: 70. 正答率(トレーニング) = 0.96
                : 70. 正答率(テスト) = 0.9172
Generation: 80. 正答率(トレーニング) = 0.91
                : 80. 正答率(テスト) = 0.9143
Generation: 90. 正答率(トレーニング) = 0.97
                : 90. 正答率(テスト) = 0.919
Generation: 100. 正答率(トレーニング) = 0.98
                : 100. 正答率(テスト) = 0.915
Generation: 110. 正答率(トレーニング) = 0.91
                : 110. 正答率(テスト) = 0.9273
Generation: 120. 正答率(トレーニング) = 0.93
                : 120. 正答率(テスト) = 0.9206
Generation: 130. 正答率(トレーニング) = 0.96
                : 130. 正答率(テスト) = 0.9325
Generation: 140. 正答率(トレーニング) = 0.99
                : 140. 正答率(テスト) = 0.9359
Generation: 150. 正答率(トレーニング) = 0.98
                : 150. 正答率(テスト) = 0.9366
Generation: 160. 正答率(トレーニング) = 0.96
                : 160. 正答率(テスト) = 0.9382
Generation: 170. 正答率(トレーニング) = 0.98
                : 170. 正答率(テスト) = 0.9221
Generation: 180. 正答率(トレーニング) = 0.97
                : 180. 正答率(テスト) = 0.9386
Generation: 190. 正答率(トレーニング) = 0.99
                : 190. 正答率(テスト) = 0.9447
Generation: 200. 正答率(トレーニング) = 0.98
                : 200. 正答率(テスト) = 0.9454
Generation: 210. 正答率(トレーニング) = 0.94
                : 210. 正答率(テスト) = 0.9444
Generation: 220. 正答率(トレーニング) = 0.97
                : 220. 正答率(テスト) = 0.9383
Generation: 230. 正答率(トレーニング) = 0.98
                : 230. 正答率(テスト) = 0.9429
Generation: 240. 正答率(トレーニング) = 0.97
                : 240. 正答率(テスト) = 0.9439
Generation: 250. 正答率(トレーニング) = 0.94
                : 250. 正答率(テスト) = 0.9414
Generation: 260. 正答率(トレーニング) = 1.0
                : 260. 正答率(テスト) = 0.9453
Generation: 270. 正答率(トレーニング) = 0.95
                : 270. 正答率(テスト) = 0.9482
Generation: 280. 正答率(トレーニング) = 0.97
                : 280. 正答率(テスト) = 0.9468
Generation: 290. 正答率(トレーニング) = 0.97
                : 290. 正答率(テスト) = 0.9396
Generation: 300. 正答率(トレーニング) = 0.97
                : 300. 正答率(テスト) = 0.9435
Generation: 310. 正答率(トレーニング) = 0.96
                : 310. 正答率(テスト) = 0.9474
Generation: 320. 正答率(トレーニング) = 0.98
                : 320. 正答率(テスト) = 0.9524
Generation: 330. 正答率(トレーニング) = 0.99
                : 330. 正答率(テスト) = 0.9484
Generation: 340. 正答率(トレーニング) = 0.98
                : 340. 正答率(テスト) = 0.9465
Generation: 350. 正答率(トレーニング) = 0.97
                : 350. 正答率(テスト) = 0.9532
Generation: 360. 正答率(トレーニング) = 0.97
                : 360. 正答率(テスト) = 0.9538
Generation: 370. 正答率(トレーニング) = 0.99
                : 370. 正答率(テスト) = 0.9478
Generation: 380. 正答率(トレーニング) = 0.99
                : 380. 正答率(テスト) = 0.9514
Generation: 390. 正答率(トレーニング) = 0.97
                : 390. 正答率(テスト) = 0.9522
Generation: 400. 正答率(トレーニング) = 0.98
                : 400. 正答率(テスト) = 0.9546
Generation: 410. 正答率(トレーニング) = 1.0
                : 410. 正答率(テスト) = 0.9589
Generation: 420. 正答率(トレーニング) = 0.99
                : 420. 正答率(テスト) = 0.9464
Generation: 430. 正答率(トレーニング) = 1.0
                : 430. 正答率(テスト) = 0.9576
Generation: 440. 正答率(トレーニング) = 0.98
                : 440. 正答率(テスト) = 0.9592
Generation: 450. 正答率(トレーニング) = 0.97
                : 450. 正答率(テスト) = 0.956
Generation: 460. 正答率(トレーニング) = 0.96
                : 460. 正答率(テスト) = 0.9556
Generation: 470. 正答率(トレーニング) = 0.96
                : 470. 正答率(テスト) = 0.9544
Generation: 480. 正答率(トレーニング) = 1.0
                : 480. 正答率(テスト) = 0.9572
Generation: 490. 正答率(トレーニング) = 0.95
                : 490. 正答率(テスト) = 0.9555
Generation: 500. 正答率(トレーニング) = 0.99
                : 500. 正答率(テスト) = 0.9556
Generation: 510. 正答率(トレーニング) = 0.99
                : 510. 正答率(テスト) = 0.9556
Generation: 520. 正答率(トレーニング) = 0.99
                : 520. 正答率(テスト) = 0.9547
Generation: 530. 正答率(トレーニング) = 0.99
                : 530. 正答率(テスト) = 0.9566
Generation: 540. 正答率(トレーニング) = 0.98
                : 540. 正答率(テスト) = 0.9572
Generation: 550. 正答率(トレーニング) = 0.98
                : 550. 正答率(テスト) = 0.9557
Generation: 560. 正答率(トレーニング) = 0.97
                : 560. 正答率(テスト) = 0.9556
Generation: 570. 正答率(トレーニング) = 0.99
                : 570. 正答率(テスト) = 0.9562
Generation: 580. 正答率(トレーニング) = 0.95
                : 580. 正答率(テスト) = 0.9591
Generation: 590. 正答率(トレーニング) = 0.99
                : 590. 正答率(テスト) = 0.9607
Generation: 600. 正答率(トレーニング) = 0.98
                : 600. 正答率(テスト) = 0.9561
Generation: 610. 正答率(トレーニング) = 0.98
                : 610. 正答率(テスト) = 0.9618
Generation: 620. 正答率(トレーニング) = 0.99
                : 620. 正答率(テスト) = 0.9579
Generation: 630. 正答率(トレーニング) = 0.99
                : 630. 正答率(テスト) = 0.9562
Generation: 640. 正答率(トレーニング) = 0.99
                : 640. 正答率(テスト) = 0.9595
Generation: 650. 正答率(トレーニング) = 0.97
                : 650. 正答率(テスト) = 0.9601
Generation: 660. 正答率(トレーニング) = 0.98
                : 660. 正答率(テスト) = 0.9527
Generation: 670. 正答率(トレーニング) = 0.99
                : 670. 正答率(テスト) = 0.9577
Generation: 680. 正答率(トレーニング) = 0.97
                : 680. 正答率(テスト) = 0.9633
Generation: 690. 正答率(トレーニング) = 1.0
                : 690. 正答率(テスト) = 0.9609
Generation: 700. 正答率(トレーニング) = 1.0
                : 700. 正答率(テスト) = 0.9645
Generation: 710. 正答率(トレーニング) = 0.98
                : 710. 正答率(テスト) = 0.9623
Generation: 720. 正答率(トレーニング) = 0.99
                : 720. 正答率(テスト) = 0.964
Generation: 730. 正答率(トレーニング) = 1.0
                : 730. 正答率(テスト) = 0.9628
Generation: 740. 正答率(トレーニング) = 1.0
                : 740. 正答率(テスト) = 0.9623
Generation: 750. 正答率(トレーニング) = 1.0
                : 750. 正答率(テスト) = 0.9654
Generation: 760. 正答率(トレーニング) = 0.98
                : 760. 正答率(テスト) = 0.9606
Generation: 770. 正答率(トレーニング) = 1.0
                : 770. 正答率(テスト) = 0.9605
Generation: 780. 正答率(トレーニング) = 0.98
                : 780. 正答率(テスト) = 0.9595
Generation: 790. 正答率(トレーニング) = 1.0
                : 790. 正答率(テスト) = 0.9586
Generation: 800. 正答率(トレーニング) = 1.0
                : 800. 正答率(テスト) = 0.961
Generation: 810. 正答率(トレーニング) = 0.98
                : 810. 正答率(テスト) = 0.9623
Generation: 820. 正答率(トレーニング) = 0.98
                : 820. 正答率(テスト) = 0.9613
Generation: 830. 正答率(トレーニング) = 0.95
                : 830. 正答率(テスト) = 0.9577
Generation: 840. 正答率(トレーニング) = 0.99
                : 840. 正答率(テスト) = 0.9638
Generation: 850. 正答率(トレーニング) = 1.0
                : 850. 正答率(テスト) = 0.9628
Generation: 860. 正答率(トレーニング) = 0.98
                : 860. 正答率(テスト) = 0.9624
Generation: 870. 正答率(トレーニング) = 1.0
                : 870. 正答率(テスト) = 0.9636
Generation: 880. 正答率(トレーニング) = 1.0
                : 880. 正答率(テスト) = 0.9633
Generation: 890. 正答率(トレーニング) = 1.0
                : 890. 正答率(テスト) = 0.9636
Generation: 900. 正答率(トレーニング) = 0.94
                : 900. 正答率(テスト) = 0.9643
Generation: 910. 正答率(トレーニング) = 1.0
                : 910. 正答率(テスト) = 0.9643
Generation: 920. 正答率(トレーニング) = 1.0
                : 920. 正答率(テスト) = 0.9643
Generation: 930. 正答率(トレーニング) = 0.97
                : 930. 正答率(テスト) = 0.9665
Generation: 940. 正答率(トレーニング) = 1.0
                : 940. 正答率(テスト) = 0.9661
Generation: 950. 正答率(トレーニング) = 0.98
                : 950. 正答率(テスト) = 0.9624
Generation: 960. 正答率(トレーニング) = 0.99
                : 960. 正答率(テスト) = 0.9636
Generation: 970. 正答率(トレーニング) = 0.98
                : 970. 正答率(テスト) = 0.9623
Generation: 980. 正答率(トレーニング) = 0.97
                : 980. 正答率(テスト) = 0.9657
Generation: 990. 正答率(トレーニング) = 0.99
                : 990. 正答率(テスト) = 0.9652
Generation: 1000. 正答率(トレーニング) = 0.98
                : 1000. 正答率(テスト) = 0.9606

AdaGrad

In [ ]:
# データの読み込み
(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.05

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.full_like(network.params[key], 1e-4)
        else:
            h[key] += np.square(grad[key])
        network.params[key] -= learning_rate * grad[key] / (np.sqrt(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.09
                : 10. 正答率(テスト) = 0.1135
Generation: 20. 正答率(トレーニング) = 0.16
                : 20. 正答率(テスト) = 0.1135
Generation: 30. 正答率(トレーニング) = 0.14
                : 30. 正答率(テスト) = 0.1135
Generation: 40. 正答率(トレーニング) = 0.13
                : 40. 正答率(テスト) = 0.1135
Generation: 50. 正答率(トレーニング) = 0.1
                : 50. 正答率(テスト) = 0.1135
Generation: 60. 正答率(トレーニング) = 0.1
                : 60. 正答率(テスト) = 0.1135
Generation: 70. 正答率(トレーニング) = 0.14
                : 70. 正答率(テスト) = 0.1234
Generation: 80. 正答率(トレーニング) = 0.28
                : 80. 正答率(テスト) = 0.1979
Generation: 90. 正答率(トレーニング) = 0.27
                : 90. 正答率(テスト) = 0.2098
Generation: 100. 正答率(トレーニング) = 0.2
                : 100. 正答率(テスト) = 0.2309
Generation: 110. 正答率(トレーニング) = 0.22
                : 110. 正答率(テスト) = 0.2257
Generation: 120. 正答率(トレーニング) = 0.28
                : 120. 正答率(テスト) = 0.2323
Generation: 130. 正答率(トレーニング) = 0.22
                : 130. 正答率(テスト) = 0.2285
Generation: 140. 正答率(トレーニング) = 0.17
                : 140. 正答率(テスト) = 0.2205
Generation: 150. 正答率(トレーニング) = 0.17
                : 150. 正答率(テスト) = 0.2196
Generation: 160. 正答率(トレーニング) = 0.15
                : 160. 正答率(テスト) = 0.2171
Generation: 170. 正答率(トレーニング) = 0.27
                : 170. 正答率(テスト) = 0.2275
Generation: 180. 正答率(トレーニング) = 0.2
                : 180. 正答率(テスト) = 0.2213
Generation: 190. 正答率(トレーニング) = 0.15
                : 190. 正答率(テスト) = 0.2197
Generation: 200. 正答率(トレーニング) = 0.25
                : 200. 正答率(テスト) = 0.2222
Generation: 210. 正答率(トレーニング) = 0.28
                : 210. 正答率(テスト) = 0.2266
Generation: 220. 正答率(トレーニング) = 0.25
                : 220. 正答率(テスト) = 0.2177
Generation: 230. 正答率(トレーニング) = 0.17
                : 230. 正答率(テスト) = 0.2283
Generation: 240. 正答率(トレーニング) = 0.21
                : 240. 正答率(テスト) = 0.2193
Generation: 250. 正答率(トレーニング) = 0.22
                : 250. 正答率(テスト) = 0.2138
Generation: 260. 正答率(トレーニング) = 0.21
                : 260. 正答率(テスト) = 0.2158
Generation: 270. 正答率(トレーニング) = 0.25
                : 270. 正答率(テスト) = 0.2203
Generation: 280. 正答率(トレーニング) = 0.26
                : 280. 正答率(テスト) = 0.2146
Generation: 290. 正答率(トレーニング) = 0.19
                : 290. 正答率(テスト) = 0.2299
Generation: 300. 正答率(トレーニング) = 0.16
                : 300. 正答率(テスト) = 0.2315
Generation: 310. 正答率(トレーニング) = 0.2
                : 310. 正答率(テスト) = 0.2313
Generation: 320. 正答率(トレーニング) = 0.22
                : 320. 正答率(テスト) = 0.2397
Generation: 330. 正答率(トレーニング) = 0.27
                : 330. 正答率(テスト) = 0.234
Generation: 340. 正答率(トレーニング) = 0.21
                : 340. 正答率(テスト) = 0.2263
Generation: 350. 正答率(トレーニング) = 0.24
                : 350. 正答率(テスト) = 0.2194
Generation: 360. 正答率(トレーニング) = 0.22
                : 360. 正答率(テスト) = 0.2407
Generation: 370. 正答率(トレーニング) = 0.27
                : 370. 正答率(テスト) = 0.2137
Generation: 380. 正答率(トレーニング) = 0.27
                : 380. 正答率(テスト) = 0.2383
Generation: 390. 正答率(トレーニング) = 0.24
                : 390. 正答率(テスト) = 0.2443
Generation: 400. 正答率(トレーニング) = 0.19
                : 400. 正答率(テスト) = 0.2427
Generation: 410. 正答率(トレーニング) = 0.2
                : 410. 正答率(テスト) = 0.2371
Generation: 420. 正答率(トレーニング) = 0.27
                : 420. 正答率(テスト) = 0.2396
Generation: 430. 正答率(トレーニング) = 0.15
                : 430. 正答率(テスト) = 0.2421
Generation: 440. 正答率(トレーニング) = 0.22
                : 440. 正答率(テスト) = 0.2403
Generation: 450. 正答率(トレーニング) = 0.21
                : 450. 正答率(テスト) = 0.2423
Generation: 460. 正答率(トレーニング) = 0.25
                : 460. 正答率(テスト) = 0.2403
Generation: 470. 正答率(トレーニング) = 0.24
                : 470. 正答率(テスト) = 0.2501
Generation: 480. 正答率(トレーニング) = 0.36
                : 480. 正答率(テスト) = 0.2439
Generation: 490. 正答率(トレーニング) = 0.23
                : 490. 正答率(テスト) = 0.2449
Generation: 500. 正答率(トレーニング) = 0.23
                : 500. 正答率(テスト) = 0.2493
Generation: 510. 正答率(トレーニング) = 0.24
                : 510. 正答率(テスト) = 0.2438
Generation: 520. 正答率(トレーニング) = 0.33
                : 520. 正答率(テスト) = 0.2496
Generation: 530. 正答率(トレーニング) = 0.27
                : 530. 正答率(テスト) = 0.2594
Generation: 540. 正答率(トレーニング) = 0.25
                : 540. 正答率(テスト) = 0.2673
Generation: 550. 正答率(トレーニング) = 0.28
                : 550. 正答率(テスト) = 0.2709
Generation: 560. 正答率(トレーニング) = 0.35
                : 560. 正答率(テスト) = 0.2651
Generation: 570. 正答率(トレーニング) = 0.33
                : 570. 正答率(テスト) = 0.2712
Generation: 580. 正答率(トレーニング) = 0.26
                : 580. 正答率(テスト) = 0.2877
Generation: 590. 正答率(トレーニング) = 0.3
                : 590. 正答率(テスト) = 0.2879
Generation: 600. 正答率(トレーニング) = 0.32
                : 600. 正答率(テスト) = 0.3087
Generation: 610. 正答率(トレーニング) = 0.32
                : 610. 正答率(テスト) = 0.3418
Generation: 620. 正答率(トレーニング) = 0.38
                : 620. 正答率(テスト) = 0.3644
Generation: 630. 正答率(トレーニング) = 0.42
                : 630. 正答率(テスト) = 0.372
Generation: 640. 正答率(トレーニング) = 0.39
                : 640. 正答率(テスト) = 0.3884
Generation: 650. 正答率(トレーニング) = 0.49
                : 650. 正答率(テスト) = 0.3973
Generation: 660. 正答率(トレーニング) = 0.44
                : 660. 正答率(テスト) = 0.4007
Generation: 670. 正答率(トレーニング) = 0.35
                : 670. 正答率(テスト) = 0.4007
Generation: 680. 正答率(トレーニング) = 0.41
                : 680. 正答率(テスト) = 0.4236
Generation: 690. 正答率(トレーニング) = 0.43
                : 690. 正答率(テスト) = 0.4417
Generation: 700. 正答率(トレーニング) = 0.47
                : 700. 正答率(テスト) = 0.4438
Generation: 710. 正答率(トレーニング) = 0.45
                : 710. 正答率(テスト) = 0.4661
Generation: 720. 正答率(トレーニング) = 0.54
                : 720. 正答率(テスト) = 0.4855
Generation: 730. 正答率(トレーニング) = 0.52
                : 730. 正答率(テスト) = 0.5075
Generation: 740. 正答率(トレーニング) = 0.53
                : 740. 正答率(テスト) = 0.4815
Generation: 750. 正答率(トレーニング) = 0.59
                : 750. 正答率(テスト) = 0.5045
Generation: 760. 正答率(トレーニング) = 0.55
                : 760. 正答率(テスト) = 0.4847
Generation: 770. 正答率(トレーニング) = 0.55
                : 770. 正答率(テスト) = 0.4897
Generation: 780. 正答率(トレーニング) = 0.54
                : 780. 正答率(テスト) = 0.5248
Generation: 790. 正答率(トレーニング) = 0.57
                : 790. 正答率(テスト) = 0.5462
Generation: 800. 正答率(トレーニング) = 0.59
                : 800. 正答率(テスト) = 0.5511
Generation: 810. 正答率(トレーニング) = 0.51
                : 810. 正答率(テスト) = 0.5509
Generation: 820. 正答率(トレーニング) = 0.51
                : 820. 正答率(テスト) = 0.5871
Generation: 830. 正答率(トレーニング) = 0.54
                : 830. 正答率(テスト) = 0.571
Generation: 840. 正答率(トレーニング) = 0.57
                : 840. 正答率(テスト) = 0.5701
Generation: 850. 正答率(トレーニング) = 0.63
                : 850. 正答率(テスト) = 0.608
Generation: 860. 正答率(トレーニング) = 0.59
                : 860. 正答率(テスト) = 0.6056
Generation: 870. 正答率(トレーニング) = 0.58
                : 870. 正答率(テスト) = 0.6253
Generation: 880. 正答率(トレーニング) = 0.57
                : 880. 正答率(テスト) = 0.6179
Generation: 890. 正答率(トレーニング) = 0.6
                : 890. 正答率(テスト) = 0.624
Generation: 900. 正答率(トレーニング) = 0.62
                : 900. 正答率(テスト) = 0.6327
Generation: 910. 正答率(トレーニング) = 0.74
                : 910. 正答率(テスト) = 0.6414
Generation: 920. 正答率(トレーニング) = 0.61
                : 920. 正答率(テスト) = 0.6479
Generation: 930. 正答率(トレーニング) = 0.64
                : 930. 正答率(テスト) = 0.6499
Generation: 940. 正答率(トレーニング) = 0.67
                : 940. 正答率(テスト) = 0.6589
Generation: 950. 正答率(トレーニング) = 0.74
                : 950. 正答率(テスト) = 0.6638
Generation: 960. 正答率(トレーニング) = 0.66
                : 960. 正答率(テスト) = 0.6663
Generation: 970. 正答率(トレーニング) = 0.61
                : 970. 正答率(テスト) = 0.6757
Generation: 980. 正答率(トレーニング) = 0.71
                : 980. 正答率(テスト) = 0.6785
Generation: 990. 正答率(トレーニング) = 0.71
                : 990. 正答率(テスト) = 0.6901
Generation: 1000. 正答率(トレーニング) = 0.67
                : 1000. 正答率(テスト) = 0.6836

RMSprop

In [ ]:
# データの読み込み
(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.75

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.12
                : 10. 正答率(テスト) = 0.098
Generation: 20. 正答率(トレーニング) = 0.18
                : 20. 正答率(テスト) = 0.1315
Generation: 30. 正答率(トレーニング) = 0.19
                : 30. 正答率(テスト) = 0.2274
Generation: 40. 正答率(トレーニング) = 0.27
                : 40. 正答率(テスト) = 0.2149
Generation: 50. 正答率(トレーニング) = 0.31
                : 50. 正答率(テスト) = 0.2242
Generation: 60. 正答率(トレーニング) = 0.28
                : 60. 正答率(テスト) = 0.2248
Generation: 70. 正答率(トレーニング) = 0.28
                : 70. 正答率(テスト) = 0.2582
Generation: 80. 正答率(トレーニング) = 0.28
                : 80. 正答率(テスト) = 0.3189
Generation: 90. 正答率(トレーニング) = 0.33
                : 90. 正答率(テスト) = 0.317
Generation: 100. 正答率(トレーニング) = 0.37
                : 100. 正答率(テスト) = 0.3216
Generation: 110. 正答率(トレーニング) = 0.32
                : 110. 正答率(テスト) = 0.324
Generation: 120. 正答率(トレーニング) = 0.41
                : 120. 正答率(テスト) = 0.3786
Generation: 130. 正答率(トレーニング) = 0.46
                : 130. 正答率(テスト) = 0.4039
Generation: 140. 正答率(トレーニング) = 0.53
                : 140. 正答率(テスト) = 0.5181
Generation: 150. 正答率(トレーニング) = 0.58
                : 150. 正答率(テスト) = 0.5073
Generation: 160. 正答率(トレーニング) = 0.7
                : 160. 正答率(テスト) = 0.6735
Generation: 170. 正答率(トレーニング) = 0.72
                : 170. 正答率(テスト) = 0.7003
Generation: 180. 正答率(トレーニング) = 0.7
                : 180. 正答率(テスト) = 0.7306
Generation: 190. 正答率(トレーニング) = 0.81
                : 190. 正答率(テスト) = 0.7522
Generation: 200. 正答率(トレーニング) = 0.69
                : 200. 正答率(テスト) = 0.7723
Generation: 210. 正答率(トレーニング) = 0.81
                : 210. 正答率(テスト) = 0.7692
Generation: 220. 正答率(トレーニング) = 0.81
                : 220. 正答率(テスト) = 0.7792
Generation: 230. 正答率(トレーニング) = 0.8
                : 230. 正答率(テスト) = 0.8094
Generation: 240. 正答率(トレーニング) = 0.87
                : 240. 正答率(テスト) = 0.8348
Generation: 250. 正答率(トレーニング) = 0.96
                : 250. 正答率(テスト) = 0.8397
Generation: 260. 正答率(トレーニング) = 0.89
                : 260. 正答率(テスト) = 0.8669
Generation: 270. 正答率(トレーニング) = 0.9
                : 270. 正答率(テスト) = 0.876
Generation: 280. 正答率(トレーニング) = 0.95
                : 280. 正答率(テスト) = 0.8817
Generation: 290. 正答率(トレーニング) = 0.94
                : 290. 正答率(テスト) = 0.8917
Generation: 300. 正答率(トレーニング) = 0.92
                : 300. 正答率(テスト) = 0.8958
Generation: 310. 正答率(トレーニング) = 0.94
                : 310. 正答率(テスト) = 0.8961
Generation: 320. 正答率(トレーニング) = 0.93
                : 320. 正答率(テスト) = 0.8945
Generation: 330. 正答率(トレーニング) = 0.97
                : 330. 正答率(テスト) = 0.9048
Generation: 340. 正答率(トレーニング) = 0.94
                : 340. 正答率(テスト) = 0.8977
Generation: 350. 正答率(トレーニング) = 0.92
                : 350. 正答率(テスト) = 0.8999
Generation: 360. 正答率(トレーニング) = 0.96
                : 360. 正答率(テスト) = 0.9047
Generation: 370. 正答率(トレーニング) = 0.94
                : 370. 正答率(テスト) = 0.9102
Generation: 380. 正答率(トレーニング) = 0.96
                : 380. 正答率(テスト) = 0.9123
Generation: 390. 正答率(トレーニング) = 0.94
                : 390. 正答率(テスト) = 0.9151
Generation: 400. 正答率(トレーニング) = 0.97
                : 400. 正答率(テスト) = 0.92
Generation: 410. 正答率(トレーニング) = 0.97
                : 410. 正答率(テスト) = 0.9183
Generation: 420. 正答率(トレーニング) = 0.98
                : 420. 正答率(テスト) = 0.9143
Generation: 430. 正答率(トレーニング) = 0.98
                : 430. 正答率(テスト) = 0.9229
Generation: 440. 正答率(トレーニング) = 0.96
                : 440. 正答率(テスト) = 0.9239
Generation: 450. 正答率(トレーニング) = 0.98
                : 450. 正答率(テスト) = 0.9226
Generation: 460. 正答率(トレーニング) = 0.96
                : 460. 正答率(テスト) = 0.9228
Generation: 470. 正答率(トレーニング) = 0.96
                : 470. 正答率(テスト) = 0.9236
Generation: 480. 正答率(トレーニング) = 0.95
                : 480. 正答率(テスト) = 0.9259
Generation: 490. 正答率(トレーニング) = 0.96
                : 490. 正答率(テスト) = 0.9235
Generation: 500. 正答率(トレーニング) = 0.99
                : 500. 正答率(テスト) = 0.9215
Generation: 510. 正答率(トレーニング) = 0.97
                : 510. 正答率(テスト) = 0.9272
Generation: 520. 正答率(トレーニング) = 0.98
                : 520. 正答率(テスト) = 0.9293
Generation: 530. 正答率(トレーニング) = 0.98
                : 530. 正答率(テスト) = 0.9281
Generation: 540. 正答率(トレーニング) = 0.97
                : 540. 正答率(テスト) = 0.9306
Generation: 550. 正答率(トレーニング) = 0.98
                : 550. 正答率(テスト) = 0.9323
Generation: 560. 正答率(トレーニング) = 0.98
                : 560. 正答率(テスト) = 0.929
Generation: 570. 正答率(トレーニング) = 0.98
                : 570. 正答率(テスト) = 0.9298
Generation: 580. 正答率(トレーニング) = 0.93
                : 580. 正答率(テスト) = 0.9248
Generation: 590. 正答率(トレーニング) = 0.95
                : 590. 正答率(テスト) = 0.9359
Generation: 600. 正答率(トレーニング) = 0.96
                : 600. 正答率(テスト) = 0.938
Generation: 610. 正答率(トレーニング) = 0.98
                : 610. 正答率(テスト) = 0.9315
Generation: 620. 正答率(トレーニング) = 1.0
                : 620. 正答率(テスト) = 0.9302
Generation: 630. 正答率(トレーニング) = 1.0
                : 630. 正答率(テスト) = 0.9333
Generation: 640. 正答率(トレーニング) = 0.97
                : 640. 正答率(テスト) = 0.926
Generation: 650. 正答率(トレーニング) = 0.97
                : 650. 正答率(テスト) = 0.9332
Generation: 660. 正答率(トレーニング) = 0.97
                : 660. 正答率(テスト) = 0.9308
Generation: 670. 正答率(トレーニング) = 0.98
                : 670. 正答率(テスト) = 0.9357
Generation: 680. 正答率(トレーニング) = 0.99
                : 680. 正答率(テスト) = 0.9387
Generation: 690. 正答率(トレーニング) = 1.0
                : 690. 正答率(テスト) = 0.9292
Generation: 700. 正答率(トレーニング) = 0.96
                : 700. 正答率(テスト) = 0.9364
Generation: 710. 正答率(トレーニング) = 0.95
                : 710. 正答率(テスト) = 0.9354
Generation: 720. 正答率(トレーニング) = 1.0
                : 720. 正答率(テスト) = 0.9396
Generation: 730. 正答率(トレーニング) = 0.97
                : 730. 正答率(テスト) = 0.939
Generation: 740. 正答率(トレーニング) = 1.0
                : 740. 正答率(テスト) = 0.9412
Generation: 750. 正答率(トレーニング) = 0.98
                : 750. 正答率(テスト) = 0.9383
Generation: 760. 正答率(トレーニング) = 0.99
                : 760. 正答率(テスト) = 0.9414
Generation: 770. 正答率(トレーニング) = 0.96
                : 770. 正答率(テスト) = 0.9333
Generation: 780. 正答率(トレーニング) = 0.99
                : 780. 正答率(テスト) = 0.939
Generation: 790. 正答率(トレーニング) = 0.98
                : 790. 正答率(テスト) = 0.9391
Generation: 800. 正答率(トレーニング) = 0.95
                : 800. 正答率(テスト) = 0.9403
Generation: 810. 正答率(トレーニング) = 0.96
                : 810. 正答率(テスト) = 0.9396
Generation: 820. 正答率(トレーニング) = 0.97
                : 820. 正答率(テスト) = 0.9418
Generation: 830. 正答率(トレーニング) = 0.99
                : 830. 正答率(テスト) = 0.9362
Generation: 840. 正答率(トレーニング) = 0.98
                : 840. 正答率(テスト) = 0.9407
Generation: 850. 正答率(トレーニング) = 0.97
                : 850. 正答率(テスト) = 0.9413
Generation: 860. 正答率(トレーニング) = 0.98
                : 860. 正答率(テスト) = 0.9413
Generation: 870. 正答率(トレーニング) = 0.98
                : 870. 正答率(テスト) = 0.9375
Generation: 880. 正答率(トレーニング) = 0.97
                : 880. 正答率(テスト) = 0.9458
Generation: 890. 正答率(トレーニング) = 0.98
                : 890. 正答率(テスト) = 0.9445
Generation: 900. 正答率(トレーニング) = 0.99
                : 900. 正答率(テスト) = 0.9427
Generation: 910. 正答率(トレーニング) = 0.98
                : 910. 正答率(テスト) = 0.9365
Generation: 920. 正答率(トレーニング) = 0.98
                : 920. 正答率(テスト) = 0.9423
Generation: 930. 正答率(トレーニング) = 0.99
                : 930. 正答率(テスト) = 0.9412
Generation: 940. 正答率(トレーニング) = 1.0
                : 940. 正答率(テスト) = 0.9452
Generation: 950. 正答率(トレーニング) = 0.98
                : 950. 正答率(テスト) = 0.9463
Generation: 960. 正答率(トレーニング) = 0.97
                : 960. 正答率(テスト) = 0.945
Generation: 970. 正答率(トレーニング) = 0.98
                : 970. 正答率(テスト) = 0.9465
Generation: 980. 正答率(トレーニング) = 0.96
                : 980. 正答率(テスト) = 0.9453
Generation: 990. 正答率(トレーニング) = 0.98
                : 990. 正答率(テスト) = 0.946
Generation: 1000. 正答率(トレーニング) = 0.97
                : 1000. 正答率(テスト) = 0.949

Adam

In [ ]:
# データの読み込み
(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)                
        
        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.36
                : 10. 正答率(テスト) = 0.3452
Generation: 20. 正答率(トレーニング) = 0.51
                : 20. 正答率(テスト) = 0.5407
Generation: 30. 正答率(トレーニング) = 0.6
                : 30. 正答率(テスト) = 0.6159
Generation: 40. 正答率(トレーニング) = 0.72
                : 40. 正答率(テスト) = 0.6707
Generation: 50. 正答率(トレーニング) = 0.76
                : 50. 正答率(テスト) = 0.6967
Generation: 60. 正答率(トレーニング) = 0.82
                : 60. 正答率(テスト) = 0.7569
Generation: 70. 正答率(トレーニング) = 0.81
                : 70. 正答率(テスト) = 0.7834
Generation: 80. 正答率(トレーニング) = 0.84
                : 80. 正答率(テスト) = 0.8161
Generation: 90. 正答率(トレーニング) = 0.84
                : 90. 正答率(テスト) = 0.8508
Generation: 100. 正答率(トレーニング) = 0.91
                : 100. 正答率(テスト) = 0.8621
Generation: 110. 正答率(トレーニング) = 0.86
                : 110. 正答率(テスト) = 0.859
Generation: 120. 正答率(トレーニング) = 0.83
                : 120. 正答率(テスト) = 0.8679
Generation: 130. 正答率(トレーニング) = 0.91
                : 130. 正答率(テスト) = 0.8638
Generation: 140. 正答率(トレーニング) = 0.83
                : 140. 正答率(テスト) = 0.8617
Generation: 150. 正答率(トレーニング) = 0.91
                : 150. 正答率(テスト) = 0.8708
Generation: 160. 正答率(トレーニング) = 0.87
                : 160. 正答率(テスト) = 0.8784
Generation: 170. 正答率(トレーニング) = 0.88
                : 170. 正答率(テスト) = 0.8758
Generation: 180. 正答率(トレーニング) = 0.93
                : 180. 正答率(テスト) = 0.8803
Generation: 190. 正答率(トレーニング) = 0.92
                : 190. 正答率(テスト) = 0.8827
Generation: 200. 正答率(トレーニング) = 0.83
                : 200. 正答率(テスト) = 0.8813
Generation: 210. 正答率(トレーニング) = 0.9
                : 210. 正答率(テスト) = 0.8891
Generation: 220. 正答率(トレーニング) = 0.89
                : 220. 正答率(テスト) = 0.8885
Generation: 230. 正答率(トレーニング) = 0.87
                : 230. 正答率(テスト) = 0.8888
Generation: 240. 正答率(トレーニング) = 0.9
                : 240. 正答率(テスト) = 0.8749
Generation: 250. 正答率(トレーニング) = 0.89
                : 250. 正答率(テスト) = 0.8915
Generation: 260. 正答率(トレーニング) = 0.92
                : 260. 正答率(テスト) = 0.8958
Generation: 270. 正答率(トレーニング) = 0.94
                : 270. 正答率(テスト) = 0.8817
Generation: 280. 正答率(トレーニング) = 0.88
                : 280. 正答率(テスト) = 0.8903
Generation: 290. 正答率(トレーニング) = 0.91
                : 290. 正答率(テスト) = 0.8976
Generation: 300. 正答率(トレーニング) = 0.92
                : 300. 正答率(テスト) = 0.8996
Generation: 310. 正答率(トレーニング) = 0.91
                : 310. 正答率(テスト) = 0.8924
Generation: 320. 正答率(トレーニング) = 0.91
                : 320. 正答率(テスト) = 0.9026
Generation: 330. 正答率(トレーニング) = 0.92
                : 330. 正答率(テスト) = 0.9009
Generation: 340. 正答率(トレーニング) = 0.9
                : 340. 正答率(テスト) = 0.9015
Generation: 350. 正答率(トレーニング) = 0.88
                : 350. 正答率(テスト) = 0.9013
Generation: 360. 正答率(トレーニング) = 0.9
                : 360. 正答率(テスト) = 0.9006
Generation: 370. 正答率(トレーニング) = 0.87
                : 370. 正答率(テスト) = 0.8997
Generation: 380. 正答率(トレーニング) = 0.85
                : 380. 正答率(テスト) = 0.8993
Generation: 390. 正答率(トレーニング) = 0.91
                : 390. 正答率(テスト) = 0.8974
Generation: 400. 正答率(トレーニング) = 0.92
                : 400. 正答率(テスト) = 0.8984
Generation: 410. 正答率(トレーニング) = 0.93
                : 410. 正答率(テスト) = 0.9063
Generation: 420. 正答率(トレーニング) = 0.93
                : 420. 正答率(テスト) = 0.9042
Generation: 430. 正答率(トレーニング) = 0.92
                : 430. 正答率(テスト) = 0.9029
Generation: 440. 正答率(トレーニング) = 0.86
                : 440. 正答率(テスト) = 0.8989
Generation: 450. 正答率(トレーニング) = 0.93
                : 450. 正答率(テスト) = 0.9097
Generation: 460. 正答率(トレーニング) = 0.92
                : 460. 正答率(テスト) = 0.9053
Generation: 470. 正答率(トレーニング) = 0.92
                : 470. 正答率(テスト) = 0.9064
Generation: 480. 正答率(トレーニング) = 0.91
                : 480. 正答率(テスト) = 0.9048
Generation: 490. 正答率(トレーニング) = 0.81
                : 490. 正答率(テスト) = 0.9046
Generation: 500. 正答率(トレーニング) = 0.93
                : 500. 正答率(テスト) = 0.9063
Generation: 510. 正答率(トレーニング) = 0.91
                : 510. 正答率(テスト) = 0.9097
Generation: 520. 正答率(トレーニング) = 0.9
                : 520. 正答率(テスト) = 0.9107
Generation: 530. 正答率(トレーニング) = 0.89
                : 530. 正答率(テスト) = 0.9122
Generation: 540. 正答率(トレーニング) = 0.86
                : 540. 正答率(テスト) = 0.9079
Generation: 550. 正答率(トレーニング) = 0.92
                : 550. 正答率(テスト) = 0.9058
Generation: 560. 正答率(トレーニング) = 0.98
                : 560. 正答率(テスト) = 0.9124
Generation: 570. 正答率(トレーニング) = 0.93
                : 570. 正答率(テスト) = 0.912
Generation: 580. 正答率(トレーニング) = 0.91
                : 580. 正答率(テスト) = 0.913
Generation: 590. 正答率(トレーニング) = 0.94
                : 590. 正答率(テスト) = 0.9122
Generation: 600. 正答率(トレーニング) = 0.86
                : 600. 正答率(テスト) = 0.9112
Generation: 610. 正答率(トレーニング) = 0.97
                : 610. 正答率(テスト) = 0.9154
Generation: 620. 正答率(トレーニング) = 0.94
                : 620. 正答率(テスト) = 0.9104
Generation: 630. 正答率(トレーニング) = 0.87
                : 630. 正答率(テスト) = 0.9159
Generation: 640. 正答率(トレーニング) = 0.96
                : 640. 正答率(テスト) = 0.9143
Generation: 650. 正答率(トレーニング) = 0.92
                : 650. 正答率(テスト) = 0.9155
Generation: 660. 正答率(トレーニング) = 0.84
                : 660. 正答率(テスト) = 0.9136
Generation: 670. 正答率(トレーニング) = 0.89
                : 670. 正答率(テスト) = 0.912
Generation: 680. 正答率(トレーニング) = 0.92
                : 680. 正答率(テスト) = 0.9098
Generation: 690. 正答率(トレーニング) = 0.92
                : 690. 正答率(テスト) = 0.9145
Generation: 700. 正答率(トレーニング) = 0.9
                : 700. 正答率(テスト) = 0.9165
Generation: 710. 正答率(トレーニング) = 0.95
                : 710. 正答率(テスト) = 0.912
Generation: 720. 正答率(トレーニング) = 0.98
                : 720. 正答率(テスト) = 0.912
Generation: 730. 正答率(トレーニング) = 0.92
                : 730. 正答率(テスト) = 0.9151
Generation: 740. 正答率(トレーニング) = 0.91
                : 740. 正答率(テスト) = 0.917
Generation: 750. 正答率(トレーニング) = 0.91
                : 750. 正答率(テスト) = 0.9154
Generation: 760. 正答率(トレーニング) = 0.92
                : 760. 正答率(テスト) = 0.9174
Generation: 770. 正答率(トレーニング) = 0.91
                : 770. 正答率(テスト) = 0.9175
Generation: 780. 正答率(トレーニング) = 0.94
                : 780. 正答率(テスト) = 0.9193
Generation: 790. 正答率(トレーニング) = 0.95
                : 790. 正答率(テスト) = 0.916
Generation: 800. 正答率(トレーニング) = 0.9
                : 800. 正答率(テスト) = 0.9165
Generation: 810. 正答率(トレーニング) = 0.88
                : 810. 正答率(テスト) = 0.91
Generation: 820. 正答率(トレーニング) = 0.88
                : 820. 正答率(テスト) = 0.9127
Generation: 830. 正答率(トレーニング) = 0.88
                : 830. 正答率(テスト) = 0.9142
Generation: 840. 正答率(トレーニング) = 0.92
                : 840. 正答率(テスト) = 0.9122
Generation: 850. 正答率(トレーニング) = 0.94
                : 850. 正答率(テスト) = 0.9198
Generation: 860. 正答率(トレーニング) = 0.92
                : 860. 正答率(テスト) = 0.9209
Generation: 870. 正答率(トレーニング) = 0.98
                : 870. 正答率(テスト) = 0.9196
Generation: 880. 正答率(トレーニング) = 0.9
                : 880. 正答率(テスト) = 0.9155
Generation: 890. 正答率(トレーニング) = 0.88
                : 890. 正答率(テスト) = 0.9151
Generation: 900. 正答率(トレーニング) = 0.96
                : 900. 正答率(テスト) = 0.9217
Generation: 910. 正答率(トレーニング) = 0.89
                : 910. 正答率(テスト) = 0.9207
Generation: 920. 正答率(トレーニング) = 0.91
                : 920. 正答率(テスト) = 0.9225
Generation: 930. 正答率(トレーニング) = 0.92
                : 930. 正答率(テスト) = 0.9211
Generation: 940. 正答率(トレーニング) = 0.95
                : 940. 正答率(テスト) = 0.9175
Generation: 950. 正答率(トレーニング) = 0.92
                : 950. 正答率(テスト) = 0.9218
Generation: 960. 正答率(トレーニング) = 0.96
                : 960. 正答率(テスト) = 0.9228
Generation: 970. 正答率(トレーニング) = 0.95
                : 970. 正答率(テスト) = 0.9211
Generation: 980. 正答率(トレーニング) = 0.95
                : 980. 正答率(テスト) = 0.9201
Generation: 990. 正答率(トレーニング) = 0.89
                : 990. 正答率(テスト) = 0.9157
Generation: 1000. 正答率(トレーニング) = 0.95
                : 1000. 正答率(テスト) = 0.9202

[try] 活性化関数と重みの初期化方法を変更して違いを見てみよう

初期状態ではsigmoid - gauss
activationはReLU、weight_init_stdは別の数値や'Xavier'・'He'に変更可能

[try] バッチ正規化をして変化を見てみよう

use_batchnormをTrueにしよう