前回はネットワークの作成と学習に必要なものの準備までを終えました。
実際に学習させてみましょう!
ニューラルネットワークの学習
まず、訓練データは全てで60000ありますが1個ずつすべてやると時間がかかるので、少ない数でランダムなデータで学習させようと思います。
ランダムな数を返す関数を作成しましょう。
import random
# 0から59999までの範囲でランダムな数値を生成
def random_number():
return random.randint(0, 59999)
random_number()
さらに学習中に精度が上がっていくかを確かめるために認識精度を計算する関数を実装しましょう。
# 認識精度
def accuracy(network, x, t):
y = predict(network,x)
y = np.argmax(y, axis=1)
t = np.argmax(t, axis=1)
accuracy = np.sum(y == t) / float(x.shape[0])
return accuracy
そしたら、ネットワークを初期化し学習率とステップ数を決めて学習させていきましょう。
学習率は0.1, ステップは1000で試してみよう。
network=init_network(784, 50, 10, weight_init_std=0.01)
learning_rate = 0.1
train_loss_list = []
train_acc_list = []
test_acc_list = []
for i in range(1000):
randam_num=random_number()
x,y=x_train_fla_norm[randam_num],y_train_one_hot[randam_num]
# 勾配の計算
grad = numerical_gradient_calc(network,x, y)
# パラメータの更新
for key in ('W1', 'b1', 'W2', 'b2'):
network['params'][key] -= learning_rate * grad[key]
loss_ = loss(network, x, y)
train_loss_list.append(loss_)
# 認識精度の推移
train_acc = accuracy(network,x_train_fla_norm, y_train_one_hot)
test_acc = accuracy(network,x_test_fla_norm, y_test_one_hot)
train_acc_list.append(train_acc)
test_acc_list.append(test_acc)
print("train acc, test acc | " + str(train_acc) + ", " + str(test_acc))
メッチャ時間かかりますね。
認識精度をグラフ化してみると学習が進むにつれて精度が高くなっていっているのが分かりますね。(やったぜ)
import matplotlib.pyplot as plt
# 認識精度
markers = {'train': 'o', 'test': 's'}
x = np.arange(len(train_acc_list))
plt.plot(x, train_acc_list, label='train acc')
plt.plot(x, test_acc_list, label='test acc', linestyle='--')
plt.xlabel("epochs")
plt.ylabel("accuracy")
plt.ylim(0, 1.0)
plt.legend(loc='lower right')
plt.show()
損失関数の値もだんだんと小さくなっていってそうです。
1000程度だとまだまだですね。
plt.plot(np.arange(len(train_loss_list)),train_loss_list, label='train acc')
plt.xlabel("epochs")
plt.ylabel("loss")
plt.legend(loc='lower right')
plt.show()
最低限の実装はできるようになった!
これでニューラルネットワークを作れるようになりました。
復習ですが以下の4つを理解することで実装までできるようになります。
- パーセプトロン(人口ニューロン)
- 活性化関数
- 損失関数
- 勾配降下法
でもすごい遅い…
1000だけで1時間以上かかりました。。
もっと早くできないだろうか。
次回からは学習を早めるためのテクニックを見ていきましょう。
コメント
コメントを投稿