準備

Googleドライブのマウント

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

sys.pathの設定

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

In [2]:
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')

overfiting

In [3]:
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.16666666666666666
                : 10. 正答率(テスト) = 0.1338
Generation: 20. 正答率(トレーニング) = 0.33
                : 20. 正答率(テスト) = 0.2527
Generation: 30. 正答率(トレーニング) = 0.49
                : 30. 正答率(テスト) = 0.3649
Generation: 40. 正答率(トレーニング) = 0.5866666666666667
                : 40. 正答率(テスト) = 0.4607
Generation: 50. 正答率(トレーニング) = 0.68
                : 50. 正答率(テスト) = 0.5245
Generation: 60. 正答率(トレーニング) = 0.7166666666666667
                : 60. 正答率(テスト) = 0.575
Generation: 70. 正答率(トレーニング) = 0.7766666666666666
                : 70. 正答率(テスト) = 0.6049
Generation: 80. 正答率(トレーニング) = 0.8366666666666667
                : 80. 正答率(テスト) = 0.6353
Generation: 90. 正答率(トレーニング) = 0.84
                : 90. 正答率(テスト) = 0.657
Generation: 100. 正答率(トレーニング) = 0.8733333333333333
                : 100. 正答率(テスト) = 0.6748
Generation: 110. 正答率(トレーニング) = 0.8766666666666667
                : 110. 正答率(テスト) = 0.6877
Generation: 120. 正答率(トレーニング) = 0.8866666666666667
                : 120. 正答率(テスト) = 0.6941
Generation: 130. 正答率(トレーニング) = 0.8966666666666666
                : 130. 正答率(テスト) = 0.7029
Generation: 140. 正答率(トレーニング) = 0.91
                : 140. 正答率(テスト) = 0.7086
Generation: 150. 正答率(トレーニング) = 0.9066666666666666
                : 150. 正答率(テスト) = 0.711
Generation: 160. 正答率(トレーニング) = 0.93
                : 160. 正答率(テスト) = 0.7186
Generation: 170. 正答率(トレーニング) = 0.9466666666666667
                : 170. 正答率(テスト) = 0.7243
Generation: 180. 正答率(トレーニング) = 0.9466666666666667
                : 180. 正答率(テスト) = 0.7276
Generation: 190. 正答率(トレーニング) = 0.96
                : 190. 正答率(テスト) = 0.7218
Generation: 200. 正答率(トレーニング) = 0.9566666666666667
                : 200. 正答率(テスト) = 0.735
Generation: 210. 正答率(トレーニング) = 0.9733333333333334
                : 210. 正答率(テスト) = 0.7323
Generation: 220. 正答率(トレーニング) = 0.9766666666666667
                : 220. 正答率(テスト) = 0.7395
Generation: 230. 正答率(トレーニング) = 0.9766666666666667
                : 230. 正答率(テスト) = 0.7363
Generation: 240. 正答率(トレーニング) = 0.9833333333333333
                : 240. 正答率(テスト) = 0.7398
Generation: 250. 正答率(トレーニング) = 0.9833333333333333
                : 250. 正答率(テスト) = 0.7435
Generation: 260. 正答率(トレーニング) = 0.9933333333333333
                : 260. 正答率(テスト) = 0.7455
Generation: 270. 正答率(トレーニング) = 0.9933333333333333
                : 270. 正答率(テスト) = 0.7455
Generation: 280. 正答率(トレーニング) = 0.9933333333333333
                : 280. 正答率(テスト) = 0.7458
Generation: 290. 正答率(トレーニング) = 0.9933333333333333
                : 290. 正答率(テスト) = 0.7474
Generation: 300. 正答率(トレーニング) = 0.9933333333333333
                : 300. 正答率(テスト) = 0.7515
Generation: 310. 正答率(トレーニング) = 0.9933333333333333
                : 310. 正答率(テスト) = 0.7497
Generation: 320. 正答率(トレーニング) = 0.9933333333333333
                : 320. 正答率(テスト) = 0.7518
Generation: 330. 正答率(トレーニング) = 0.9933333333333333
                : 330. 正答率(テスト) = 0.7551
Generation: 340. 正答率(トレーニング) = 0.9933333333333333
                : 340. 正答率(テスト) = 0.7559
Generation: 350. 正答率(トレーニング) = 0.9966666666666667
                : 350. 正答率(テスト) = 0.7552
Generation: 360. 正答率(トレーニング) = 0.9966666666666667
                : 360. 正答率(テスト) = 0.7528
Generation: 370. 正答率(トレーニング) = 0.9966666666666667
                : 370. 正答率(テスト) = 0.7557
Generation: 380. 正答率(トレーニング) = 1.0
                : 380. 正答率(テスト) = 0.7581
Generation: 390. 正答率(トレーニング) = 0.9966666666666667
                : 390. 正答率(テスト) = 0.7572
Generation: 400. 正答率(トレーニング) = 1.0
                : 400. 正答率(テスト) = 0.7599
Generation: 410. 正答率(トレーニング) = 1.0
                : 410. 正答率(テスト) = 0.759
Generation: 420. 正答率(トレーニング) = 1.0
                : 420. 正答率(テスト) = 0.7599
Generation: 430. 正答率(トレーニング) = 0.9966666666666667
                : 430. 正答率(テスト) = 0.7584
Generation: 440. 正答率(トレーニング) = 1.0
                : 440. 正答率(テスト) = 0.759
Generation: 450. 正答率(トレーニング) = 1.0
                : 450. 正答率(テスト) = 0.7589
Generation: 460. 正答率(トレーニング) = 1.0
                : 460. 正答率(テスト) = 0.7617
Generation: 470. 正答率(トレーニング) = 1.0
                : 470. 正答率(テスト) = 0.7624
Generation: 480. 正答率(トレーニング) = 1.0
                : 480. 正答率(テスト) = 0.7622
Generation: 490. 正答率(トレーニング) = 1.0
                : 490. 正答率(テスト) = 0.7634
Generation: 500. 正答率(トレーニング) = 1.0
                : 500. 正答率(テスト) = 0.764
Generation: 510. 正答率(トレーニング) = 1.0
                : 510. 正答率(テスト) = 0.7624
Generation: 520. 正答率(トレーニング) = 1.0
                : 520. 正答率(テスト) = 0.7628
Generation: 530. 正答率(トレーニング) = 1.0
                : 530. 正答率(テスト) = 0.7632
Generation: 540. 正答率(トレーニング) = 1.0
                : 540. 正答率(テスト) = 0.7633
Generation: 550. 正答率(トレーニング) = 1.0
                : 550. 正答率(テスト) = 0.7641
Generation: 560. 正答率(トレーニング) = 1.0
                : 560. 正答率(テスト) = 0.763
Generation: 570. 正答率(トレーニング) = 1.0
                : 570. 正答率(テスト) = 0.7648
Generation: 580. 正答率(トレーニング) = 1.0
                : 580. 正答率(テスト) = 0.7643
Generation: 590. 正答率(トレーニング) = 1.0
                : 590. 正答率(テスト) = 0.7647
Generation: 600. 正答率(トレーニング) = 1.0
                : 600. 正答率(テスト) = 0.7649
Generation: 610. 正答率(トレーニング) = 1.0
                : 610. 正答率(テスト) = 0.7668
Generation: 620. 正答率(トレーニング) = 1.0
                : 620. 正答率(テスト) = 0.7663
Generation: 630. 正答率(トレーニング) = 1.0
                : 630. 正答率(テスト) = 0.7642
Generation: 640. 正答率(トレーニング) = 1.0
                : 640. 正答率(テスト) = 0.7657
Generation: 650. 正答率(トレーニング) = 1.0
                : 650. 正答率(テスト) = 0.7643
Generation: 660. 正答率(トレーニング) = 1.0
                : 660. 正答率(テスト) = 0.7666
Generation: 670. 正答率(トレーニング) = 1.0
                : 670. 正答率(テスト) = 0.7661
Generation: 680. 正答率(トレーニング) = 1.0
                : 680. 正答率(テスト) = 0.767
Generation: 690. 正答率(トレーニング) = 1.0
                : 690. 正答率(テスト) = 0.7675
Generation: 700. 正答率(トレーニング) = 1.0
                : 700. 正答率(テスト) = 0.7662
Generation: 710. 正答率(トレーニング) = 1.0
                : 710. 正答率(テスト) = 0.7679
Generation: 720. 正答率(トレーニング) = 1.0
                : 720. 正答率(テスト) = 0.7668
Generation: 730. 正答率(トレーニング) = 1.0
                : 730. 正答率(テスト) = 0.7667
Generation: 740. 正答率(トレーニング) = 1.0
                : 740. 正答率(テスト) = 0.766
Generation: 750. 正答率(トレーニング) = 1.0
                : 750. 正答率(テスト) = 0.7675
Generation: 760. 正答率(トレーニング) = 1.0
                : 760. 正答率(テスト) = 0.7665
Generation: 770. 正答率(トレーニング) = 1.0
                : 770. 正答率(テスト) = 0.7672
Generation: 780. 正答率(トレーニング) = 1.0
                : 780. 正答率(テスト) = 0.7664
Generation: 790. 正答率(トレーニング) = 1.0
                : 790. 正答率(テスト) = 0.7684
Generation: 800. 正答率(トレーニング) = 1.0
                : 800. 正答率(テスト) = 0.768
Generation: 810. 正答率(トレーニング) = 1.0
                : 810. 正答率(テスト) = 0.7674
Generation: 820. 正答率(トレーニング) = 1.0
                : 820. 正答率(テスト) = 0.7672
Generation: 830. 正答率(トレーニング) = 1.0
                : 830. 正答率(テスト) = 0.7672
Generation: 840. 正答率(トレーニング) = 1.0
                : 840. 正答率(テスト) = 0.7671
Generation: 850. 正答率(トレーニング) = 1.0
                : 850. 正答率(テスト) = 0.7675
Generation: 860. 正答率(トレーニング) = 1.0
                : 860. 正答率(テスト) = 0.7672
Generation: 870. 正答率(トレーニング) = 1.0
                : 870. 正答率(テスト) = 0.7677
Generation: 880. 正答率(トレーニング) = 1.0
                : 880. 正答率(テスト) = 0.7676
Generation: 890. 正答率(トレーニング) = 1.0
                : 890. 正答率(テスト) = 0.7677
Generation: 900. 正答率(トレーニング) = 1.0
                : 900. 正答率(テスト) = 0.7674
Generation: 910. 正答率(トレーニング) = 1.0
                : 910. 正答率(テスト) = 0.7675
Generation: 920. 正答率(トレーニング) = 1.0
                : 920. 正答率(テスト) = 0.7684
Generation: 930. 正答率(トレーニング) = 1.0
                : 930. 正答率(テスト) = 0.7673
Generation: 940. 正答率(トレーニング) = 1.0
                : 940. 正答率(テスト) = 0.7684
Generation: 950. 正答率(トレーニング) = 1.0
                : 950. 正答率(テスト) = 0.7684
Generation: 960. 正答率(トレーニング) = 1.0
                : 960. 正答率(テスト) = 0.7689
Generation: 970. 正答率(トレーニング) = 1.0
                : 970. 正答率(テスト) = 0.7687
Generation: 980. 正答率(トレーニング) = 1.0
                : 980. 正答率(テスト) = 0.7683
Generation: 990. 正答率(トレーニング) = 1.0
                : 990. 正答率(テスト) = 0.7678
Generation: 1000. 正答率(トレーニング) = 1.0
                : 1000. 正答率(テスト) = 0.769

weight decay

L2

In [16]:
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.17666666666666667
                : 10. 正答率(テスト) = 0.141
Generation: 20. 正答率(トレーニング) = 0.23666666666666666
                : 20. 正答率(テスト) = 0.1803
Generation: 30. 正答率(トレーニング) = 0.3
                : 30. 正答率(テスト) = 0.2233
Generation: 40. 正答率(トレーニング) = 0.35
                : 40. 正答率(テスト) = 0.2756
Generation: 50. 正答率(トレーニング) = 0.36
                : 50. 正答率(テスト) = 0.2855
Generation: 60. 正答率(トレーニング) = 0.37666666666666665
                : 60. 正答率(テスト) = 0.3005
Generation: 70. 正答率(トレーニング) = 0.3933333333333333
                : 70. 正答率(テスト) = 0.3149
Generation: 80. 正答率(トレーニング) = 0.3933333333333333
                : 80. 正答率(テスト) = 0.3202
Generation: 90. 正答率(トレーニング) = 0.39666666666666667
                : 90. 正答率(テスト) = 0.3282
Generation: 100. 正答率(トレーニング) = 0.42
                : 100. 正答率(テスト) = 0.3363
Generation: 110. 正答率(トレーニング) = 0.42333333333333334
                : 110. 正答率(テスト) = 0.3431
Generation: 120. 正答率(トレーニング) = 0.44
                : 120. 正答率(テスト) = 0.3536
Generation: 130. 正答率(トレーニング) = 0.43333333333333335
                : 130. 正答率(テスト) = 0.3574
Generation: 140. 正答率(トレーニング) = 0.43666666666666665
                : 140. 正答率(テスト) = 0.3595
Generation: 150. 正答率(トレーニング) = 0.4266666666666667
                : 150. 正答率(テスト) = 0.3644
Generation: 160. 正答率(トレーニング) = 0.43333333333333335
                : 160. 正答率(テスト) = 0.3714
Generation: 170. 正答率(トレーニング) = 0.45
                : 170. 正答率(テスト) = 0.3777
Generation: 180. 正答率(トレーニング) = 0.4533333333333333
                : 180. 正答率(テスト) = 0.3885
Generation: 190. 正答率(トレーニング) = 0.49666666666666665
                : 190. 正答率(テスト) = 0.3987
Generation: 200. 正答率(トレーニング) = 0.57
                : 200. 正答率(テスト) = 0.4243
Generation: 210. 正答率(トレーニング) = 0.5833333333333334
                : 210. 正答率(テスト) = 0.4387
Generation: 220. 正答率(トレーニング) = 0.61
                : 220. 正答率(テスト) = 0.4515
Generation: 230. 正答率(トレーニング) = 0.6166666666666667
                : 230. 正答率(テスト) = 0.4607
Generation: 240. 正答率(トレーニング) = 0.6366666666666667
                : 240. 正答率(テスト) = 0.4726
Generation: 250. 正答率(トレーニング) = 0.66
                : 250. 正答率(テスト) = 0.4889
Generation: 260. 正答率(トレーニング) = 0.6666666666666666
                : 260. 正答率(テスト) = 0.4974
Generation: 270. 正答率(トレーニング) = 0.6966666666666667
                : 270. 正答率(テスト) = 0.5195
Generation: 280. 正答率(トレーニング) = 0.7033333333333334
                : 280. 正答率(テスト) = 0.5333
Generation: 290. 正答率(トレーニング) = 0.71
                : 290. 正答率(テスト) = 0.5461
Generation: 300. 正答率(トレーニング) = 0.72
                : 300. 正答率(テスト) = 0.5542
Generation: 310. 正答率(トレーニング) = 0.7333333333333333
                : 310. 正答率(テスト) = 0.558
Generation: 320. 正答率(トレーニング) = 0.7366666666666667
                : 320. 正答率(テスト) = 0.5801
Generation: 330. 正答率(トレーニング) = 0.7433333333333333
                : 330. 正答率(テスト) = 0.5796
Generation: 340. 正答率(トレーニング) = 0.7466666666666667
                : 340. 正答率(テスト) = 0.5796
Generation: 350. 正答率(トレーニング) = 0.7466666666666667
                : 350. 正答率(テスト) = 0.5809
Generation: 360. 正答率(トレーニング) = 0.7566666666666667
                : 360. 正答率(テスト) = 0.5875
Generation: 370. 正答率(トレーニング) = 0.77
                : 370. 正答率(テスト) = 0.598
Generation: 380. 正答率(トレーニング) = 0.7733333333333333
                : 380. 正答率(テスト) = 0.6012
Generation: 390. 正答率(トレーニング) = 0.7766666666666666
                : 390. 正答率(テスト) = 0.5941
Generation: 400. 正答率(トレーニング) = 0.7833333333333333
                : 400. 正答率(テスト) = 0.6057
Generation: 410. 正答率(トレーニング) = 0.7766666666666666
                : 410. 正答率(テスト) = 0.6036
Generation: 420. 正答率(トレーニング) = 0.79
                : 420. 正答率(テスト) = 0.6034
Generation: 430. 正答率(トレーニング) = 0.7933333333333333
                : 430. 正答率(テスト) = 0.603
Generation: 440. 正答率(トレーニング) = 0.7866666666666666
                : 440. 正答率(テスト) = 0.6084
Generation: 450. 正答率(トレーニング) = 0.8
                : 450. 正答率(テスト) = 0.6102
Generation: 460. 正答率(トレーニング) = 0.8133333333333334
                : 460. 正答率(テスト) = 0.6112
Generation: 470. 正答率(トレーニング) = 0.8033333333333333
                : 470. 正答率(テスト) = 0.6115
Generation: 480. 正答率(トレーニング) = 0.81
                : 480. 正答率(テスト) = 0.6112
Generation: 490. 正答率(トレーニング) = 0.7933333333333333
                : 490. 正答率(テスト) = 0.6119
Generation: 500. 正答率(トレーニング) = 0.82
                : 500. 正答率(テスト) = 0.6207
Generation: 510. 正答率(トレーニング) = 0.83
                : 510. 正答率(テスト) = 0.6265
Generation: 520. 正答率(トレーニング) = 0.84
                : 520. 正答率(テスト) = 0.631
Generation: 530. 正答率(トレーニング) = 0.8533333333333334
                : 530. 正答率(テスト) = 0.6307
Generation: 540. 正答率(トレーニング) = 0.85
                : 540. 正答率(テスト) = 0.6342
Generation: 550. 正答率(トレーニング) = 0.8566666666666667
                : 550. 正答率(テスト) = 0.6338
Generation: 560. 正答率(トレーニング) = 0.84
                : 560. 正答率(テスト) = 0.6312
Generation: 570. 正答率(トレーニング) = 0.84
                : 570. 正答率(テスト) = 0.6329
Generation: 580. 正答率(トレーニング) = 0.87
                : 580. 正答率(テスト) = 0.639
Generation: 590. 正答率(トレーニング) = 0.8633333333333333
                : 590. 正答率(テスト) = 0.6415
Generation: 600. 正答率(トレーニング) = 0.8633333333333333
                : 600. 正答率(テスト) = 0.6335
Generation: 610. 正答率(トレーニング) = 0.8366666666666667
                : 610. 正答率(テスト) = 0.6313
Generation: 620. 正答率(トレーニング) = 0.8633333333333333
                : 620. 正答率(テスト) = 0.6313
Generation: 630. 正答率(トレーニング) = 0.8466666666666667
                : 630. 正答率(テスト) = 0.6283
Generation: 640. 正答率(トレーニング) = 0.8466666666666667
                : 640. 正答率(テスト) = 0.6336
Generation: 650. 正答率(トレーニング) = 0.8466666666666667
                : 650. 正答率(テスト) = 0.6299
Generation: 660. 正答率(トレーニング) = 0.88
                : 660. 正答率(テスト) = 0.6373
Generation: 670. 正答率(トレーニング) = 0.8633333333333333
                : 670. 正答率(テスト) = 0.6405
Generation: 680. 正答率(トレーニング) = 0.8666666666666667
                : 680. 正答率(テスト) = 0.6391
Generation: 690. 正答率(トレーニング) = 0.8633333333333333
                : 690. 正答率(テスト) = 0.6405
Generation: 700. 正答率(トレーニング) = 0.86
                : 700. 正答率(テスト) = 0.6409
Generation: 710. 正答率(トレーニング) = 0.8766666666666667
                : 710. 正答率(テスト) = 0.6413
Generation: 720. 正答率(トレーニング) = 0.8733333333333333
                : 720. 正答率(テスト) = 0.6437
Generation: 730. 正答率(トレーニング) = 0.86
                : 730. 正答率(テスト) = 0.6407
Generation: 740. 正答率(トレーニング) = 0.88
                : 740. 正答率(テスト) = 0.6495
Generation: 750. 正答率(トレーニング) = 0.87
                : 750. 正答率(テスト) = 0.6414
Generation: 760. 正答率(トレーニング) = 0.8766666666666667
                : 760. 正答率(テスト) = 0.6394
Generation: 770. 正答率(トレーニング) = 0.8666666666666667
                : 770. 正答率(テスト) = 0.6323
Generation: 780. 正答率(トレーニング) = 0.8733333333333333
                : 780. 正答率(テスト) = 0.6466
Generation: 790. 正答率(トレーニング) = 0.8733333333333333
                : 790. 正答率(テスト) = 0.645
Generation: 800. 正答率(トレーニング) = 0.8733333333333333
                : 800. 正答率(テスト) = 0.6475
Generation: 810. 正答率(トレーニング) = 0.8666666666666667
                : 810. 正答率(テスト) = 0.6439
Generation: 820. 正答率(トレーニング) = 0.87
                : 820. 正答率(テスト) = 0.6508
Generation: 830. 正答率(トレーニング) = 0.87
                : 830. 正答率(テスト) = 0.6507
Generation: 840. 正答率(トレーニング) = 0.87
                : 840. 正答率(テスト) = 0.6455
Generation: 850. 正答率(トレーニング) = 0.88
                : 850. 正答率(テスト) = 0.6437
Generation: 860. 正答率(トレーニング) = 0.8633333333333333
                : 860. 正答率(テスト) = 0.6372
Generation: 870. 正答率(トレーニング) = 0.8766666666666667
                : 870. 正答率(テスト) = 0.6417
Generation: 880. 正答率(トレーニング) = 0.87
                : 880. 正答率(テスト) = 0.6394
Generation: 890. 正答率(トレーニング) = 0.8933333333333333
                : 890. 正答率(テスト) = 0.6503
Generation: 900. 正答率(トレーニング) = 0.8733333333333333
                : 900. 正答率(テスト) = 0.6501
Generation: 910. 正答率(トレーニング) = 0.88
                : 910. 正答率(テスト) = 0.6543
Generation: 920. 正答率(トレーニング) = 0.8733333333333333
                : 920. 正答率(テスト) = 0.6525
Generation: 930. 正答率(トレーニング) = 0.8666666666666667
                : 930. 正答率(テスト) = 0.6436
Generation: 940. 正答率(トレーニング) = 0.88
                : 940. 正答率(テスト) = 0.6388
Generation: 950. 正答率(トレーニング) = 0.8833333333333333
                : 950. 正答率(テスト) = 0.651
Generation: 960. 正答率(トレーニング) = 0.8633333333333333
                : 960. 正答率(テスト) = 0.6438
Generation: 970. 正答率(トレーニング) = 0.8733333333333333
                : 970. 正答率(テスト) = 0.644
Generation: 980. 正答率(トレーニング) = 0.85
                : 980. 正答率(テスト) = 0.638
Generation: 990. 正答率(トレーニング) = 0.8733333333333333
                : 990. 正答率(テスト) = 0.6424
Generation: 1000. 正答率(トレーニング) = 0.8766666666666667
                : 1000. 正答率(テスト) = 0.6442

L1

In [14]:
(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.52
                : 10. 正答率(テスト) = 0.3813
Generation: 20. 正答率(トレーニング) = 0.7566666666666667
                : 20. 正答率(テスト) = 0.6132
Generation: 30. 正答率(トレーニング) = 0.71
                : 30. 正答率(テスト) = 0.5736
Generation: 40. 正答率(トレーニング) = 0.8766666666666667
                : 40. 正答率(テスト) = 0.7042
Generation: 50. 正答率(トレーニング) = 0.6533333333333333
                : 50. 正答率(テスト) = 0.5142
Generation: 60. 正答率(トレーニング) = 0.7633333333333333
                : 60. 正答率(テスト) = 0.5884
Generation: 70. 正答率(トレーニング) = 0.89
                : 70. 正答率(テスト) = 0.7217
Generation: 80. 正答率(トレーニング) = 0.78
                : 80. 正答率(テスト) = 0.5813
Generation: 90. 正答率(トレーニング) = 0.93
                : 90. 正答率(テスト) = 0.746
Generation: 100. 正答率(トレーニング) = 0.91
                : 100. 正答率(テスト) = 0.7387
Generation: 110. 正答率(トレーニング) = 0.6533333333333333
                : 110. 正答率(テスト) = 0.5043
Generation: 120. 正答率(トレーニング) = 0.86
                : 120. 正答率(テスト) = 0.7114
Generation: 130. 正答率(トレーニング) = 0.91
                : 130. 正答率(テスト) = 0.7105
Generation: 140. 正答率(トレーニング) = 0.92
                : 140. 正答率(テスト) = 0.7121
Generation: 150. 正答率(トレーニング) = 0.8633333333333333
                : 150. 正答率(テスト) = 0.6612
Generation: 160. 正答率(トレーニング) = 0.8466666666666667
                : 160. 正答率(テスト) = 0.6429
Generation: 170. 正答率(トレーニング) = 0.9266666666666666
                : 170. 正答率(テスト) = 0.7335
Generation: 180. 正答率(トレーニング) = 0.87
                : 180. 正答率(テスト) = 0.6578
Generation: 190. 正答率(トレーニング) = 0.8866666666666667
                : 190. 正答率(テスト) = 0.7206
Generation: 200. 正答率(トレーニング) = 0.5866666666666667
                : 200. 正答率(テスト) = 0.4706
Generation: 210. 正答率(トレーニング) = 0.8533333333333334
                : 210. 正答率(テスト) = 0.662
Generation: 220. 正答率(トレーニング) = 0.82
                : 220. 正答率(テスト) = 0.6621
Generation: 230. 正答率(トレーニング) = 0.9233333333333333
                : 230. 正答率(テスト) = 0.7496
Generation: 240. 正答率(トレーニング) = 0.8033333333333333
                : 240. 正答率(テスト) = 0.636
Generation: 250. 正答率(トレーニング) = 0.93
                : 250. 正答率(テスト) = 0.7466
Generation: 260. 正答率(トレーニング) = 0.9233333333333333
                : 260. 正答率(テスト) = 0.7394
Generation: 270. 正答率(トレーニング) = 0.72
                : 270. 正答率(テスト) = 0.563
Generation: 280. 正答率(トレーニング) = 0.7666666666666667
                : 280. 正答率(テスト) = 0.6186
Generation: 290. 正答率(トレーニング) = 0.8733333333333333
                : 290. 正答率(テスト) = 0.7044
Generation: 300. 正答率(トレーニング) = 0.9
                : 300. 正答率(テスト) = 0.7229
Generation: 310. 正答率(トレーニング) = 0.49666666666666665
                : 310. 正答率(テスト) = 0.4344
Generation: 320. 正答率(トレーニング) = 0.9133333333333333
                : 320. 正答率(テスト) = 0.7002
Generation: 330. 正答率(トレーニング) = 0.9166666666666666
                : 330. 正答率(テスト) = 0.7298
Generation: 340. 正答率(トレーニング) = 0.8966666666666666
                : 340. 正答率(テスト) = 0.7013
Generation: 350. 正答率(トレーニング) = 0.8833333333333333
                : 350. 正答率(テスト) = 0.6654
Generation: 360. 正答率(トレーニング) = 0.85
                : 360. 正答率(テスト) = 0.6866
Generation: 370. 正答率(トレーニング) = 0.87
                : 370. 正答率(テスト) = 0.6926
Generation: 380. 正答率(トレーニング) = 0.93
                : 380. 正答率(テスト) = 0.7414
Generation: 390. 正答率(トレーニング) = 0.8766666666666667
                : 390. 正答率(テスト) = 0.6596
Generation: 400. 正答率(トレーニング) = 0.8266666666666667
                : 400. 正答率(テスト) = 0.6491
Generation: 410. 正答率(トレーニング) = 0.93
                : 410. 正答率(テスト) = 0.7361
Generation: 420. 正答率(トレーニング) = 0.9066666666666666
                : 420. 正答率(テスト) = 0.7195
Generation: 430. 正答率(トレーニング) = 0.67
                : 430. 正答率(テスト) = 0.5136
Generation: 440. 正答率(トレーニング) = 0.9333333333333333
                : 440. 正答率(テスト) = 0.7456
Generation: 450. 正答率(トレーニング) = 0.9066666666666666
                : 450. 正答率(テスト) = 0.7171
Generation: 460. 正答率(トレーニング) = 0.9133333333333333
                : 460. 正答率(テスト) = 0.698
Generation: 470. 正答率(トレーニング) = 0.7366666666666667
                : 470. 正答率(テスト) = 0.5758
Generation: 480. 正答率(トレーニング) = 0.89
                : 480. 正答率(テスト) = 0.696
Generation: 490. 正答率(トレーニング) = 0.78
                : 490. 正答率(テスト) = 0.6268
Generation: 500. 正答率(トレーニング) = 0.9266666666666666
                : 500. 正答率(テスト) = 0.7197
Generation: 510. 正答率(トレーニング) = 0.6866666666666666
                : 510. 正答率(テスト) = 0.5386
Generation: 520. 正答率(トレーニング) = 0.9666666666666667
                : 520. 正答率(テスト) = 0.7449
Generation: 530. 正答率(トレーニング) = 0.9366666666666666
                : 530. 正答率(テスト) = 0.7264
Generation: 540. 正答率(トレーニング) = 0.71
                : 540. 正答率(テスト) = 0.5436
Generation: 550. 正答率(トレーニング) = 0.95
                : 550. 正答率(テスト) = 0.7253
Generation: 560. 正答率(トレーニング) = 0.9666666666666667
                : 560. 正答率(テスト) = 0.7352
Generation: 570. 正答率(トレーニング) = 0.96
                : 570. 正答率(テスト) = 0.7413
Generation: 580. 正答率(トレーニング) = 0.94
                : 580. 正答率(テスト) = 0.6976
Generation: 590. 正答率(トレーニング) = 0.8533333333333334
                : 590. 正答率(テスト) = 0.6489
Generation: 600. 正答率(トレーニング) = 0.9466666666666667
                : 600. 正答率(テスト) = 0.7249
Generation: 610. 正答率(トレーニング) = 0.94
                : 610. 正答率(テスト) = 0.7256
Generation: 620. 正答率(トレーニング) = 0.8233333333333334
                : 620. 正答率(テスト) = 0.6351
Generation: 630. 正答率(トレーニング) = 0.9233333333333333
                : 630. 正答率(テスト) = 0.6777
Generation: 640. 正答率(トレーニング) = 0.9466666666666667
                : 640. 正答率(テスト) = 0.702
Generation: 650. 正答率(トレーニング) = 0.9766666666666667
                : 650. 正答率(テスト) = 0.7307
Generation: 660. 正答率(トレーニング) = 0.68
                : 660. 正答率(テスト) = 0.5186
Generation: 670. 正答率(トレーニング) = 0.9733333333333334
                : 670. 正答率(テスト) = 0.7331
Generation: 680. 正答率(トレーニング) = 0.94
                : 680. 正答率(テスト) = 0.7053
Generation: 690. 正答率(トレーニング) = 0.9566666666666667
                : 690. 正答率(テスト) = 0.7016
Generation: 700. 正答率(トレーニング) = 0.84
                : 700. 正答率(テスト) = 0.6435
Generation: 710. 正答率(トレーニング) = 0.9766666666666667
                : 710. 正答率(テスト) = 0.7352
Generation: 720. 正答率(トレーニング) = 0.9733333333333334
                : 720. 正答率(テスト) = 0.7318
Generation: 730. 正答率(トレーニング) = 0.97
                : 730. 正答率(テスト) = 0.7217
Generation: 740. 正答率(トレーニング) = 0.9666666666666667
                : 740. 正答率(テスト) = 0.7198
Generation: 750. 正答率(トレーニング) = 0.6166666666666667
                : 750. 正答率(テスト) = 0.4452
Generation: 760. 正答率(トレーニング) = 0.98
                : 760. 正答率(テスト) = 0.7199
Generation: 770. 正答率(トレーニング) = 0.9766666666666667
                : 770. 正答率(テスト) = 0.7301
Generation: 780. 正答率(トレーニング) = 0.98
                : 780. 正答率(テスト) = 0.7224
Generation: 790. 正答率(トレーニング) = 0.8766666666666667
                : 790. 正答率(テスト) = 0.6461
Generation: 800. 正答率(トレーニング) = 0.9566666666666667
                : 800. 正答率(テスト) = 0.7064
Generation: 810. 正答率(トレーニング) = 0.8
                : 810. 正答率(テスト) = 0.5966
Generation: 820. 正答率(トレーニング) = 0.99
                : 820. 正答率(テスト) = 0.7343
Generation: 830. 正答率(トレーニング) = 0.98
                : 830. 正答率(テスト) = 0.7142
Generation: 840. 正答率(トレーニング) = 0.82
                : 840. 正答率(テスト) = 0.6028
Generation: 850. 正答率(トレーニング) = 0.99
                : 850. 正答率(テスト) = 0.7279
Generation: 860. 正答率(トレーニング) = 0.65
                : 860. 正答率(テスト) = 0.5236
Generation: 870. 正答率(トレーニング) = 0.9566666666666667
                : 870. 正答率(テスト) = 0.71
Generation: 880. 正答率(トレーニング) = 0.9666666666666667
                : 880. 正答率(テスト) = 0.7027
Generation: 890. 正答率(トレーニング) = 0.9833333333333333
                : 890. 正答率(テスト) = 0.7274
Generation: 900. 正答率(トレーニング) = 0.9933333333333333
                : 900. 正答率(テスト) = 0.7265
Generation: 910. 正答率(トレーニング) = 0.8833333333333333
                : 910. 正答率(テスト) = 0.6193
Generation: 920. 正答率(トレーニング) = 0.97
                : 920. 正答率(テスト) = 0.7107
Generation: 930. 正答率(トレーニング) = 0.88
                : 930. 正答率(テスト) = 0.6645
Generation: 940. 正答率(トレーニング) = 0.9933333333333333
                : 940. 正答率(テスト) = 0.7262
Generation: 950. 正答率(トレーニング) = 0.9966666666666667
                : 950. 正答率(テスト) = 0.7266
Generation: 960. 正答率(トレーニング) = 0.9933333333333333
                : 960. 正答率(テスト) = 0.7258
Generation: 970. 正答率(トレーニング) = 0.9933333333333333
                : 970. 正答率(テスト) = 0.7214
Generation: 980. 正答率(トレーニング) = 0.99
                : 980. 正答率(テスト) = 0.724
Generation: 990. 正答率(トレーニング) = 0.7066666666666667
                : 990. 正答率(テスト) = 0.5554
Generation: 1000. 正答率(トレーニング) = 0.9366666666666666
                : 1000. 正答率(テスト) = 0.6749

[try] weigth_decay_lambdaの値を変更して正則化の強さを確認しよう


Dropout

In [18]:
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
In [26]:
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.01
# ====================================================

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.7)
# 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.34
                : 10. 正答率(テスト) = 0.2542
Generation: 20. 正答率(トレーニング) = 0.47
                : 20. 正答率(テスト) = 0.3543
Generation: 30. 正答率(トレーニング) = 0.6033333333333334
                : 30. 正答率(テスト) = 0.4725
Generation: 40. 正答率(トレーニング) = 0.7233333333333334
                : 40. 正答率(テスト) = 0.5893
Generation: 50. 正答率(トレーニング) = 0.7933333333333333
                : 50. 正答率(テスト) = 0.6338
Generation: 60. 正答率(トレーニング) = 0.81
                : 60. 正答率(テスト) = 0.6422
Generation: 70. 正答率(トレーニング) = 0.8966666666666666
                : 70. 正答率(テスト) = 0.7172
Generation: 80. 正答率(トレーニング) = 0.91
                : 80. 正答率(テスト) = 0.7353
Generation: 90. 正答率(トレーニング) = 0.92
                : 90. 正答率(テスト) = 0.7379
Generation: 100. 正答率(トレーニング) = 0.9066666666666666
                : 100. 正答率(テスト) = 0.7201
Generation: 110. 正答率(トレーニング) = 0.8833333333333333
                : 110. 正答率(テスト) = 0.7155
Generation: 120. 正答率(トレーニング) = 0.93
                : 120. 正答率(テスト) = 0.7374
Generation: 130. 正答率(トレーニング) = 0.9333333333333333
                : 130. 正答率(テスト) = 0.7365
Generation: 140. 正答率(トレーニング) = 0.92
                : 140. 正答率(テスト) = 0.7168
Generation: 150. 正答率(トレーニング) = 0.93
                : 150. 正答率(テスト) = 0.729
Generation: 160. 正答率(トレーニング) = 0.93
                : 160. 正答率(テスト) = 0.7117
Generation: 170. 正答率(トレーニング) = 0.9266666666666666
                : 170. 正答率(テスト) = 0.7256
Generation: 180. 正答率(トレーニング) = 0.9333333333333333
                : 180. 正答率(テスト) = 0.724
Generation: 190. 正答率(トレーニング) = 0.9333333333333333
                : 190. 正答率(テスト) = 0.7191
Generation: 200. 正答率(トレーニング) = 0.9566666666666667
                : 200. 正答率(テスト) = 0.7241
Generation: 210. 正答率(トレーニング) = 0.95
                : 210. 正答率(テスト) = 0.7263
Generation: 220. 正答率(トレーニング) = 0.9433333333333334
                : 220. 正答率(テスト) = 0.7183
Generation: 230. 正答率(トレーニング) = 0.9466666666666667
                : 230. 正答率(テスト) = 0.7253
Generation: 240. 正答率(トレーニング) = 0.9266666666666666
                : 240. 正答率(テスト) = 0.7263
Generation: 250. 正答率(トレーニング) = 0.94
                : 250. 正答率(テスト) = 0.7369
Generation: 260. 正答率(トレーニング) = 0.9133333333333333
                : 260. 正答率(テスト) = 0.7079
Generation: 270. 正答率(トレーニング) = 0.94
                : 270. 正答率(テスト) = 0.7168
Generation: 280. 正答率(トレーニング) = 0.92
                : 280. 正答率(テスト) = 0.7197
Generation: 290. 正答率(トレーニング) = 0.8933333333333333
                : 290. 正答率(テスト) = 0.6858
Generation: 300. 正答率(トレーニング) = 0.91
                : 300. 正答率(テスト) = 0.7066
Generation: 310. 正答率(トレーニング) = 0.9233333333333333
                : 310. 正答率(テスト) = 0.7198
Generation: 320. 正答率(トレーニング) = 0.9333333333333333
                : 320. 正答率(テスト) = 0.7103
Generation: 330. 正答率(トレーニング) = 0.93
                : 330. 正答率(テスト) = 0.7165
Generation: 340. 正答率(トレーニング) = 0.9233333333333333
                : 340. 正答率(テスト) = 0.7152
Generation: 350. 正答率(トレーニング) = 0.8966666666666666
                : 350. 正答率(テスト) = 0.6881
Generation: 360. 正答率(トレーニング) = 0.94
                : 360. 正答率(テスト) = 0.7149
Generation: 370. 正答率(トレーニング) = 0.9366666666666666
                : 370. 正答率(テスト) = 0.715
Generation: 380. 正答率(トレーニング) = 0.9266666666666666
                : 380. 正答率(テスト) = 0.7157
Generation: 390. 正答率(トレーニング) = 0.9233333333333333
                : 390. 正答率(テスト) = 0.709
Generation: 400. 正答率(トレーニング) = 0.92
                : 400. 正答率(テスト) = 0.714
Generation: 410. 正答率(トレーニング) = 0.9033333333333333
                : 410. 正答率(テスト) = 0.7029
Generation: 420. 正答率(トレーニング) = 0.9266666666666666
                : 420. 正答率(テスト) = 0.7141
Generation: 430. 正答率(トレーニング) = 0.9133333333333333
                : 430. 正答率(テスト) = 0.7083
Generation: 440. 正答率(トレーニング) = 0.9
                : 440. 正答率(テスト) = 0.6797
Generation: 450. 正答率(トレーニング) = 0.91
                : 450. 正答率(テスト) = 0.6962
Generation: 460. 正答率(トレーニング) = 0.91
                : 460. 正答率(テスト) = 0.7097
Generation: 470. 正答率(トレーニング) = 0.9233333333333333
                : 470. 正答率(テスト) = 0.7054
Generation: 480. 正答率(トレーニング) = 0.8733333333333333
                : 480. 正答率(テスト) = 0.6708
Generation: 490. 正答率(トレーニング) = 0.8933333333333333
                : 490. 正答率(テスト) = 0.6914
Generation: 500. 正答率(トレーニング) = 0.92
                : 500. 正答率(テスト) = 0.7054
Generation: 510. 正答率(トレーニング) = 0.9066666666666666
                : 510. 正答率(テスト) = 0.6979
Generation: 520. 正答率(トレーニング) = 0.9
                : 520. 正答率(テスト) = 0.7027
Generation: 530. 正答率(トレーニング) = 0.93
                : 530. 正答率(テスト) = 0.7083
Generation: 540. 正答率(トレーニング) = 0.9166666666666666
                : 540. 正答率(テスト) = 0.7116
Generation: 550. 正答率(トレーニング) = 0.8833333333333333
                : 550. 正答率(テスト) = 0.6899
Generation: 560. 正答率(トレーニング) = 0.9166666666666666
                : 560. 正答率(テスト) = 0.6989
Generation: 570. 正答率(トレーニング) = 0.92
                : 570. 正答率(テスト) = 0.6941
Generation: 580. 正答率(トレーニング) = 0.9166666666666666
                : 580. 正答率(テスト) = 0.6849
Generation: 590. 正答率(トレーニング) = 0.9033333333333333
                : 590. 正答率(テスト) = 0.6888
Generation: 600. 正答率(トレーニング) = 0.8866666666666667
                : 600. 正答率(テスト) = 0.679
Generation: 610. 正答率(トレーニング) = 0.8833333333333333
                : 610. 正答率(テスト) = 0.6816
Generation: 620. 正答率(トレーニング) = 0.89
                : 620. 正答率(テスト) = 0.6646
Generation: 630. 正答率(トレーニング) = 0.8866666666666667
                : 630. 正答率(テスト) = 0.6722
Generation: 640. 正答率(トレーニング) = 0.86
                : 640. 正答率(テスト) = 0.6666
Generation: 650. 正答率(トレーニング) = 0.8433333333333334
                : 650. 正答率(テスト) = 0.6584
Generation: 660. 正答率(トレーニング) = 0.8233333333333334
                : 660. 正答率(テスト) = 0.6522
Generation: 670. 正答率(トレーニング) = 0.8233333333333334
                : 670. 正答率(テスト) = 0.6521
Generation: 680. 正答率(トレーニング) = 0.8566666666666667
                : 680. 正答率(テスト) = 0.6608
Generation: 690. 正答率(トレーニング) = 0.8666666666666667
                : 690. 正答率(テスト) = 0.6513
Generation: 700. 正答率(トレーニング) = 0.8366666666666667
                : 700. 正答率(テスト) = 0.6496
Generation: 710. 正答率(トレーニング) = 0.8766666666666667
                : 710. 正答率(テスト) = 0.6788
Generation: 720. 正答率(トレーニング) = 0.8633333333333333
                : 720. 正答率(テスト) = 0.663
Generation: 730. 正答率(トレーニング) = 0.87
                : 730. 正答率(テスト) = 0.679
Generation: 740. 正答率(トレーニング) = 0.85
                : 740. 正答率(テスト) = 0.6625
Generation: 750. 正答率(トレーニング) = 0.8333333333333334
                : 750. 正答率(テスト) = 0.6605
Generation: 760. 正答率(トレーニング) = 0.8666666666666667
                : 760. 正答率(テスト) = 0.6696
Generation: 770. 正答率(トレーニング) = 0.86
                : 770. 正答率(テスト) = 0.6633
Generation: 780. 正答率(トレーニング) = 0.8833333333333333
                : 780. 正答率(テスト) = 0.66
Generation: 790. 正答率(トレーニング) = 0.8633333333333333
                : 790. 正答率(テスト) = 0.6604
Generation: 800. 正答率(トレーニング) = 0.8633333333333333
                : 800. 正答率(テスト) = 0.6764
Generation: 810. 正答率(トレーニング) = 0.8366666666666667
                : 810. 正答率(テスト) = 0.6596
Generation: 820. 正答率(トレーニング) = 0.8466666666666667
                : 820. 正答率(テスト) = 0.6626
Generation: 830. 正答率(トレーニング) = 0.85
                : 830. 正答率(テスト) = 0.6388
Generation: 840. 正答率(トレーニング) = 0.8766666666666667
                : 840. 正答率(テスト) = 0.6614
Generation: 850. 正答率(トレーニング) = 0.8666666666666667
                : 850. 正答率(テスト) = 0.6776
Generation: 860. 正答率(トレーニング) = 0.8666666666666667
                : 860. 正答率(テスト) = 0.6694
Generation: 870. 正答率(トレーニング) = 0.87
                : 870. 正答率(テスト) = 0.6742
Generation: 880. 正答率(トレーニング) = 0.89
                : 880. 正答率(テスト) = 0.676
Generation: 890. 正答率(トレーニング) = 0.8833333333333333
                : 890. 正答率(テスト) = 0.6756
Generation: 900. 正答率(トレーニング) = 0.8833333333333333
                : 900. 正答率(テスト) = 0.6729
Generation: 910. 正答率(トレーニング) = 0.8633333333333333
                : 910. 正答率(テスト) = 0.6679
Generation: 920. 正答率(トレーニング) = 0.8833333333333333
                : 920. 正答率(テスト) = 0.6811
Generation: 930. 正答率(トレーニング) = 0.8733333333333333
                : 930. 正答率(テスト) = 0.6688
Generation: 940. 正答率(トレーニング) = 0.8866666666666667
                : 940. 正答率(テスト) = 0.6746
Generation: 950. 正答率(トレーニング) = 0.8633333333333333
                : 950. 正答率(テスト) = 0.6742
Generation: 960. 正答率(トレーニング) = 0.85
                : 960. 正答率(テスト) = 0.6702
Generation: 970. 正答率(トレーニング) = 0.87
                : 970. 正答率(テスト) = 0.6792
Generation: 980. 正答率(トレーニング) = 0.8733333333333333
                : 980. 正答率(テスト) = 0.666
Generation: 990. 正答率(トレーニング) = 0.8766666666666667
                : 990. 正答率(テスト) = 0.6869
Generation: 1000. 正答率(トレーニング) = 0.8533333333333334
                : 1000. 正答率(テスト) = 0.6559

[try] dropout_ratioの値を変更してみよう

[try] optimizerとdropout_ratioの値を変更してみよう


Dropout + L1

In [27]:
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.08
# ====================================================

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

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

train_loss_list = []
accuracies_train = []
accuracies_test = []
hidden_layer_num = network.hidden_layer_num

plot_interval=10

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

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.17666666666666667
                : 10. 正答率(テスト) = 0.1599
Generation: 20. 正答率(トレーニング) = 0.19
                : 20. 正答率(テスト) = 0.1668
Generation: 30. 正答率(トレーニング) = 0.19333333333333333
                : 30. 正答率(テスト) = 0.1678
Generation: 40. 正答率(トレーニング) = 0.19666666666666666
                : 40. 正答率(テスト) = 0.1769
Generation: 50. 正答率(トレーニング) = 0.23333333333333334
                : 50. 正答率(テスト) = 0.1942
Generation: 60. 正答率(トレーニング) = 0.25666666666666665
                : 60. 正答率(テスト) = 0.2066
Generation: 70. 正答率(トレーニング) = 0.29333333333333333
                : 70. 正答率(テスト) = 0.2187
Generation: 80. 正答率(トレーニング) = 0.29333333333333333
                : 80. 正答率(テスト) = 0.2314
Generation: 90. 正答率(トレーニング) = 0.29333333333333333
                : 90. 正答率(テスト) = 0.245
Generation: 100. 正答率(トレーニング) = 0.3233333333333333
                : 100. 正答率(テスト) = 0.2599
Generation: 110. 正答率(トレーニング) = 0.32
                : 110. 正答率(テスト) = 0.2678
Generation: 120. 正答率(トレーニング) = 0.3466666666666667
                : 120. 正答率(テスト) = 0.2858
Generation: 130. 正答率(トレーニング) = 0.36
                : 130. 正答率(テスト) = 0.2919
Generation: 140. 正答率(トレーニング) = 0.39666666666666667
                : 140. 正答率(テスト) = 0.3109
Generation: 150. 正答率(トレーニング) = 0.41
                : 150. 正答率(テスト) = 0.3263
Generation: 160. 正答率(トレーニング) = 0.44
                : 160. 正答率(テスト) = 0.3491
Generation: 170. 正答率(トレーニング) = 0.47333333333333333
                : 170. 正答率(テスト) = 0.368
Generation: 180. 正答率(トレーニング) = 0.49
                : 180. 正答率(テスト) = 0.3904
Generation: 190. 正答率(トレーニング) = 0.5333333333333333
                : 190. 正答率(テスト) = 0.4049
Generation: 200. 正答率(トレーニング) = 0.5466666666666666
                : 200. 正答率(テスト) = 0.4191
Generation: 210. 正答率(トレーニング) = 0.5733333333333334
                : 210. 正答率(テスト) = 0.4377
Generation: 220. 正答率(トレーニング) = 0.5833333333333334
                : 220. 正答率(テスト) = 0.4457
Generation: 230. 正答率(トレーニング) = 0.6233333333333333
                : 230. 正答率(テスト) = 0.4653
Generation: 240. 正答率(トレーニング) = 0.64
                : 240. 正答率(テスト) = 0.4837
Generation: 250. 正答率(トレーニング) = 0.6533333333333333
                : 250. 正答率(テスト) = 0.4943
Generation: 260. 正答率(トレーニング) = 0.6666666666666666
                : 260. 正答率(テスト) = 0.5009
Generation: 270. 正答率(トレーニング) = 0.6966666666666667
                : 270. 正答率(テスト) = 0.526
Generation: 280. 正答率(トレーニング) = 0.7
                : 280. 正答率(テスト) = 0.5364
Generation: 290. 正答率(トレーニング) = 0.71
                : 290. 正答率(テスト) = 0.5359
Generation: 300. 正答率(トレーニング) = 0.7166666666666667
                : 300. 正答率(テスト) = 0.5551
Generation: 310. 正答率(トレーニング) = 0.7133333333333334
                : 310. 正答率(テスト) = 0.5687
Generation: 320. 正答率(トレーニング) = 0.73
                : 320. 正答率(テスト) = 0.564
Generation: 330. 正答率(トレーニング) = 0.7533333333333333
                : 330. 正答率(テスト) = 0.577
Generation: 340. 正答率(トレーニング) = 0.7566666666666667
                : 340. 正答率(テスト) = 0.5898
Generation: 350. 正答率(トレーニング) = 0.7633333333333333
                : 350. 正答率(テスト) = 0.5926
Generation: 360. 正答率(トレーニング) = 0.7733333333333333
                : 360. 正答率(テスト) = 0.6042
Generation: 370. 正答率(トレーニング) = 0.7766666666666666
                : 370. 正答率(テスト) = 0.6136
Generation: 380. 正答率(トレーニング) = 0.79
                : 380. 正答率(テスト) = 0.6298
Generation: 390. 正答率(トレーニング) = 0.8133333333333334
                : 390. 正答率(テスト) = 0.6289
Generation: 400. 正答率(トレーニング) = 0.81
                : 400. 正答率(テスト) = 0.6355
Generation: 410. 正答率(トレーニング) = 0.8
                : 410. 正答率(テスト) = 0.6314
Generation: 420. 正答率(トレーニング) = 0.79
                : 420. 正答率(テスト) = 0.6335
Generation: 430. 正答率(トレーニング) = 0.8233333333333334
                : 430. 正答率(テスト) = 0.6499
Generation: 440. 正答率(トレーニング) = 0.8133333333333334
                : 440. 正答率(テスト) = 0.6458
Generation: 450. 正答率(トレーニング) = 0.8333333333333334
                : 450. 正答率(テスト) = 0.6477
Generation: 460. 正答率(トレーニング) = 0.8466666666666667
                : 460. 正答率(テスト) = 0.6676
Generation: 470. 正答率(トレーニング) = 0.8566666666666667
                : 470. 正答率(テスト) = 0.6659
Generation: 480. 正答率(トレーニング) = 0.8566666666666667
                : 480. 正答率(テスト) = 0.6662
Generation: 490. 正答率(トレーニング) = 0.8533333333333334
                : 490. 正答率(テスト) = 0.672
Generation: 500. 正答率(トレーニング) = 0.8666666666666667
                : 500. 正答率(テスト) = 0.6765
Generation: 510. 正答率(トレーニング) = 0.8633333333333333
                : 510. 正答率(テスト) = 0.6767
Generation: 520. 正答率(トレーニング) = 0.8733333333333333
                : 520. 正答率(テスト) = 0.6808
Generation: 530. 正答率(トレーニング) = 0.8733333333333333
                : 530. 正答率(テスト) = 0.6841
Generation: 540. 正答率(トレーニング) = 0.87
                : 540. 正答率(テスト) = 0.6849
Generation: 550. 正答率(トレーニング) = 0.8633333333333333
                : 550. 正答率(テスト) = 0.6881
Generation: 560. 正答率(トレーニング) = 0.8733333333333333
                : 560. 正答率(テスト) = 0.6813
Generation: 570. 正答率(トレーニング) = 0.88
                : 570. 正答率(テスト) = 0.689
Generation: 580. 正答率(トレーニング) = 0.89
                : 580. 正答率(テスト) = 0.6975
Generation: 590. 正答率(トレーニング) = 0.8966666666666666
                : 590. 正答率(テスト) = 0.7008
Generation: 600. 正答率(トレーニング) = 0.88
                : 600. 正答率(テスト) = 0.6989
Generation: 610. 正答率(トレーニング) = 0.8933333333333333
                : 610. 正答率(テスト) = 0.7022
Generation: 620. 正答率(トレーニング) = 0.89
                : 620. 正答率(テスト) = 0.6954
Generation: 630. 正答率(トレーニング) = 0.8933333333333333
                : 630. 正答率(テスト) = 0.7079
Generation: 640. 正答率(トレーニング) = 0.8833333333333333
                : 640. 正答率(テスト) = 0.7021
Generation: 650. 正答率(トレーニング) = 0.8866666666666667
                : 650. 正答率(テスト) = 0.7011
Generation: 660. 正答率(トレーニング) = 0.89
                : 660. 正答率(テスト) = 0.7023
Generation: 670. 正答率(トレーニング) = 0.9
                : 670. 正答率(テスト) = 0.7142
Generation: 680. 正答率(トレーニング) = 0.9033333333333333
                : 680. 正答率(テスト) = 0.7101
Generation: 690. 正答率(トレーニング) = 0.8966666666666666
                : 690. 正答率(テスト) = 0.7132
Generation: 700. 正答率(トレーニング) = 0.8966666666666666
                : 700. 正答率(テスト) = 0.7131
Generation: 710. 正答率(トレーニング) = 0.9033333333333333
                : 710. 正答率(テスト) = 0.716
Generation: 720. 正答率(トレーニング) = 0.9033333333333333
                : 720. 正答率(テスト) = 0.7199
Generation: 730. 正答率(トレーニング) = 0.9033333333333333
                : 730. 正答率(テスト) = 0.7224
Generation: 740. 正答率(トレーニング) = 0.9033333333333333
                : 740. 正答率(テスト) = 0.7168
Generation: 750. 正答率(トレーニング) = 0.91
                : 750. 正答率(テスト) = 0.7232
Generation: 760. 正答率(トレーニング) = 0.9133333333333333
                : 760. 正答率(テスト) = 0.7263
Generation: 770. 正答率(トレーニング) = 0.9166666666666666
                : 770. 正答率(テスト) = 0.7277
Generation: 780. 正答率(トレーニング) = 0.93
                : 780. 正答率(テスト) = 0.725
Generation: 790. 正答率(トレーニング) = 0.92
                : 790. 正答率(テスト) = 0.7252
Generation: 800. 正答率(トレーニング) = 0.9233333333333333
                : 800. 正答率(テスト) = 0.7275
Generation: 810. 正答率(トレーニング) = 0.93
                : 810. 正答率(テスト) = 0.7263
Generation: 820. 正答率(トレーニング) = 0.9366666666666666
                : 820. 正答率(テスト) = 0.7303
Generation: 830. 正答率(トレーニング) = 0.9233333333333333
                : 830. 正答率(テスト) = 0.7263
Generation: 840. 正答率(トレーニング) = 0.9333333333333333
                : 840. 正答率(テスト) = 0.7284
Generation: 850. 正答率(トレーニング) = 0.9333333333333333
                : 850. 正答率(テスト) = 0.7341
Generation: 860. 正答率(トレーニング) = 0.94
                : 860. 正答率(テスト) = 0.7288
Generation: 870. 正答率(トレーニング) = 0.94
                : 870. 正答率(テスト) = 0.7353
Generation: 880. 正答率(トレーニング) = 0.9366666666666666
                : 880. 正答率(テスト) = 0.7356
Generation: 890. 正答率(トレーニング) = 0.94
                : 890. 正答率(テスト) = 0.7393
Generation: 900. 正答率(トレーニング) = 0.94
                : 900. 正答率(テスト) = 0.7383
Generation: 910. 正答率(トレーニング) = 0.9366666666666666
                : 910. 正答率(テスト) = 0.7363
Generation: 920. 正答率(トレーニング) = 0.9433333333333334
                : 920. 正答率(テスト) = 0.7407
Generation: 930. 正答率(トレーニング) = 0.94
                : 930. 正答率(テスト) = 0.7339
Generation: 940. 正答率(トレーニング) = 0.9466666666666667
                : 940. 正答率(テスト) = 0.7441
Generation: 950. 正答率(トレーニング) = 0.9466666666666667
                : 950. 正答率(テスト) = 0.7419
Generation: 960. 正答率(トレーニング) = 0.9466666666666667
                : 960. 正答率(テスト) = 0.7385
Generation: 970. 正答率(トレーニング) = 0.9533333333333334
                : 970. 正答率(テスト) = 0.7445
Generation: 980. 正答率(トレーニング) = 0.9433333333333334
                : 980. 正答率(テスト) = 0.7416
Generation: 990. 正答率(トレーニング) = 0.9566666666666667
                : 990. 正答率(テスト) = 0.7479
Generation: 1000. 正答率(トレーニング) = 0.96
                : 1000. 正答率(テスト) = 0.7481