From a37bc17cc1fb4b335c7aa41cb430623929dba2bd Mon Sep 17 00:00:00 2001 From: higaki sota <79880317+sno-windy@users.noreply.github.com> Date: Mon, 26 May 2025 00:36:05 +0900 Subject: [PATCH] =?UTF-8?q?[ch04]=E5=90=84epoch=E3=81=94=E3=81=A8=E3=81=AB?= =?UTF-8?q?=E3=81=99=E3=81=B9=E3=81=A6=E3=81=AE=E8=A8=93=E7=B7=B4=E3=83=87?= =?UTF-8?q?=E3=83=BC=E3=82=BF=E3=82=92=E8=A6=8B=E3=82=8B=E3=82=88=E3=81=86?= =?UTF-8?q?=E3=81=AB=E3=81=99=E3=82=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ch04/train_neuralnet.py | 55 ++++++++++++++++++++++------------------- 1 file changed, 29 insertions(+), 26 deletions(-) diff --git a/ch04/train_neuralnet.py b/ch04/train_neuralnet.py index 0a0f70af5..528ee5f5a 100644 --- a/ch04/train_neuralnet.py +++ b/ch04/train_neuralnet.py @@ -11,7 +11,7 @@ network = TwoLayerNet(input_size=784, hidden_size=50, output_size=10) -iters_num = 10000 # 繰り返しの回数を適宜設定する +epoch_num = 20 train_size = x_train.shape[0] batch_size = 100 learning_rate = 0.1 @@ -20,30 +20,33 @@ train_acc_list = [] test_acc_list = [] -iter_per_epoch = max(train_size / batch_size, 1) - -for i in range(iters_num): - batch_mask = np.random.choice(train_size, batch_size) - x_batch = x_train[batch_mask] - t_batch = t_train[batch_mask] - - # 勾配の計算 - #grad = network.numerical_gradient(x_batch, t_batch) - grad = network.gradient(x_batch, t_batch) - - # パラメータの更新 - for key in ('W1', 'b1', 'W2', 'b2'): - network.params[key] -= learning_rate * grad[key] - - loss = network.loss(x_batch, t_batch) - train_loss_list.append(loss) - - if i % iter_per_epoch == 0: - train_acc = network.accuracy(x_train, t_train) - test_acc = network.accuracy(x_test, t_test) - train_acc_list.append(train_acc) - test_acc_list.append(test_acc) - print("train acc, test acc | " + str(train_acc) + ", " + str(test_acc)) +iter_per_epoch = max(train_size // batch_size, 1) + + +for epoch in range(epoch_num): + perm = np.random.permutation(train_size) + + for i in range(iter_per_epoch): + batch_mask = perm[i * batch_size : (i + 1) * batch_size] + x_batch = x_train[batch_mask] + t_batch = t_train[batch_mask] + + # 勾配の計算 + #grad = network.numerical_gradient(x_batch, t_batch) + grad = network.gradient(x_batch, t_batch) + + # パラメータの更新 + for key in ('W1', 'b1', 'W2', 'b2'): + network.params[key] -= learning_rate * grad[key] + + loss = network.loss(x_batch, t_batch) + train_loss_list.append(loss) + + train_acc = network.accuracy(x_train, t_train) + test_acc = network.accuracy(x_test, t_test) + train_acc_list.append(train_acc) + test_acc_list.append(test_acc) + print("train acc, test acc | " + str(train_acc) + ", " + str(test_acc)) # グラフの描画 markers = {'train': 'o', 'test': 's'} @@ -54,4 +57,4 @@ plt.ylabel("accuracy") plt.ylim(0, 1.0) plt.legend(loc='lower right') -plt.show() \ No newline at end of file +plt.show()