ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 미니배치 학습 구현하기
    딥러닝 2020. 1. 16. 17:38

    미니배치 학습이란

    훈련 데이터 중 일부를 꺼내고(미니배치), 그 미니배치에 대해서 경사법으로 매개변수를 갱신하는 것

     

    앞의 2층 신경망 클래스와 MNIST 데이터셋을 사용하여 구현해 봅시다.

     

    이때 학습과정에서 오버피팅이 일어나지 않게 해야합니다.

    어떻게 할까요?

    학습 도중에 시험 데이터로 오버피팅이 일어나는지 안나는지 확인하면서 학습을 하면 됩니다.

    (신경망은 범용성을 가져야하므로 시험 데이터는 훈련 데이터와 달라야겠죠.)

    오버피팅이 일어나면 학습을 중단하고 다른 데이터셋으로 훈련을 하면 됩니다.

     

    일정 구간마다 평가를 하고 정확도를 기록하면 좋을 거 같네요.

     

     

     

     

    구현

    import numpy as np
    from dataset.mnist import load_mnist
    from two_layer_net import TwoLayerNet
    
    # 데이터 읽기
    (x_train, t_train), (x_test, t_test) = load_mnist(normalize=True, one_hot_label=True)
    
    network = TwoLayerNet(input_size = 784, hidden_size = 50, output_size = 10)
    
    #하이퍼파라미터
    iters_num = 1 #반복횟수
    train_size = x_train.shape[0]
    batch_size = 100 #미니배치 크기
    learning_rate = 0.1
    
    train_loss_list = []
    train_acc_list = []
    test_acc_list = []
    
    #1에폭당 반복수
    iter_per_epoch = max(train_size / batch_size, 1)
    
    for i in range(iters_num):
        #미니배치 획득
        #train_size 이하의 값을 batch_size개 만큼 뽑아라
        batch_mask = np.random.choice(train_size, batch_size)
        x_batch = x_train[batch_mask]
        t_batch = t_train[batch_mask]
    
        #print(x_train.shape) : (60000, 784)
        #print(t_train.shape) : (60000, 10)
        #print(batch_mask.shape) : (100,)
        #print(x_batch.shape) : (100, 784)
        #print(t_batch.shape) : (100, 10)
    
    
        #기울기 계산
        #손실함수를 지가 만들어서 함
        #입력값 : 100개의 데이터
        #출력값 : 기울기가 저장된 grad배열
        grad = network.numerical_gradient(x_batch, t_batch)
    
        #매개변수 갱신(경사 하강법)
        for i in ('W1', 'b1', 'W2', 'b2'):
            network.params[i] -= learning_rate * grad[i]
    
        #학습 경과 기록
        #손실함수 다시 계산
        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.accurarcy(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))

     

     

     

     

     

    [참고]

    -밑바닥부터 배우는 딥러닝

    '딥러닝' 카테고리의 다른 글

    오차역전파법 - 덧셈 계층, 곱셈 계층  (0) 2020.01.27
    오차역전파법 - 계산 그래프  (0) 2020.01.27
    2층 신경망 클래스 구현하기  (0) 2020.01.16
    손실함수와 경사법  (0) 2020.01.16
    3층 신경망 구현해보기  (0) 2020.01.10
Designed by Tistory.