훈련 데이터 중 일부를 무작위로 꺼내어(꺼낸 것들이 하나의 묶음임. 그래서 미니배치) 꺼낸 미니배치에 대해서 경사법으로 매개변수를 갱신하는 것
import numpy as np
# from keras.datasets import mnist
from dataset.mnist import load_mnist # 같은 폴더 안에 dataset이 존재해야 한다!
from two_layer_net import TwoLayerNet
(X_train, y_train), (X_test, y_test) = load_mnist(normalize=True, one_hot_label=True)
train_loss_list = []
# 하이퍼파라미터
iters_num = 10000 # 반복 횟수
train_size = X_train.shape[0]
batch_size = 100 # 미니배치 크기
learning_rate = 0.1
network = TwoLayerNet(input_size=784, hidden_size=50, output_size=10)
for i in range(iters_num):
# 미니배치 획득
batch_mask = np.random.choice(train_size, batch_size)
X_batch = X_train[batch_mask]
y_batch = y_train[batch_mask]
# 기울기 계산
# grad = network.numerical_gradient(X_batch, y_batch)
grad = network.gradient(X_batch, y_batch) # 성능 개선판
# 매개변수 갱신
for key in ('W1', 'b1', 'W2', 'b2'):
network.params[key] -= learning_rate * grad[key]
# 학습 경과 기록
loss = network.loss(X_batch, y_batch)
train_loss_list.append(loss)
학습 횟수가 늘어가면서 손실 함수의 값이 줄어든다