ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [NLP] 신경망의 활성화 함수들 (Activation Functions of Neural Network) - 3
    ML/NLP 2020. 3. 14. 00:45

     

     

    이전 포스팅에서 신경망의 구조를 배웠으니 예제에 적용해보자.

     

    예제로 아주 유명한 손글씨 분류 데이터셋을 가지고 해보겠다.

     

     

    손글씨 숫자 인식


    이미 학습된 매개변수를 사용하여 학습 과정은 생략하고, 추론 과정만 구현하겠다.

     

    이 추론 과정을 신경망의 순전파(forward propagation)라고도 한다.

    import sys, os
    sys.path.append(os.pardir) # 부모 디텍터리의 파일을 가져올 수 있도록 설정
    from dataset.mnist import load_mnist
    (x_train, y_train), (x_test, y_test) = load_mnist(flatten=True, normalize=False)
    print(x_train.shape)
    print(y_train.shape)
    print(x_test.shape)
    print(y_test.shape)

    load_mnist 함수의 인수는 세 가지가 있다,

    1. normalize : 입력 이미지의 픽셀값을 0.0~1.0 사이의 값으로 정규화를 할건지 // False면 원래 값 그대로 0~255 사이의 값 유지

    2. flatten : 입력 이미지를 1차원 배열로 만들건지 // False면 입력 이미지를 1x28x28의 3차원 배열로, True면 784개의 원소로 이뤄진 1차원 배열로 저장한다.

    3. one_hot_label : 레이블을 원-팟 인코딩 형태로 저장할지를 정한다. // False면 '7'이나 '2'와 같이 숫자 형태의 레이블을 저장함

     

     

     

    신경망의 추론 처리


    MNIST 데이터셋을 가지고 추론을 수행하는 신경망을 구현하자.

    입력층 뉴런을 784개, 출력층 뉴런을 10개로 구성한다.

    def get_data():
        (x_train, t_train), (x_test, t_test) = load_mnist(flatten=True, normalize=True, one_hot_label=False)
        
        return x_test, t_test
    def init_network():
        with open("sample_weight.pkl", "rb") as f:
            network = pickle.load(f)
            
            return network
    def predict(network, x):
        W1, W2, W3 = network['W1'], network['W2'], network['W3']
        b1, b2, b3 = network['b1'], network['b2'], network['b3']
        
        a1 = np.dot(x, W1) + b1
        z1 = sigmoid(a1)
        
        a2 = np.dot(z1, W2) + b2
        z2 = sigmoid(a2)
        
        a3 = np.dot(z2, W3) + b3
        y = sigmoid(a3)
        
        return y
    a3 = np.dot(z2, W3) + b3
        y = sigmoid(a3)
        
        return y
    x, t = get_data()
    network = init_network()
    
    accuracy_cnt = 0
    for i in range(len(x)):
        y = predict(network, x[i])
        p = np.argmax(y) # 확률이 가장 높은 원소의 인덱스를 얻는다
        
        if p == t[i]:
            accuracy_cnt += 1
            
    print("Accuracy:", str(float(accuracy_cnt)/len(x)))
    x, t = get_data()
    network = init_network()
    Out:    Accuracy: 0.9352

     

     

     

     

    배치 처리


    위에서는 이미지 하나씩만 추론에 넣었는데, 한번에 여러 장의 이미지를 넣어줄 수도 있다.

     

    이처럼 하나로 묶은 입력 데이터를 배치라 한다. 

     

    컴퓨터는 큰 배열을 한꺼번에 계산하는 것이 분할된 작은 배열을 여러 번 계산하는 것보타 빠르다.

     

    배치 처리를 구현해보자.

    x, t = get_data()
    network = init_network()
    
    batch_size = 100 # 배치크기
    accuracy_cnt = 0
    
    for i in range(0, len(x), batch_size):
        x_batch = x[i:i+batch_size]
        y_batch = predict(network, x_batch)
        p = np.argmax(y_batch, axis=1)
        accuracy_cnt += np.sum(p==t[i:i+batch_size])
        
    print("Accuracy:", str(float(accuracy_cnt)/len(x)))
    Out:    Accuracy: 0.9352

     

    이후 진행할 신경망 학습에서도 데이터를 배치로 묶어서 학습하게 될 것이다.

     

     

     

    밑바닥부터 시작하는 딥러닝 1
    국내도서
    저자 : 사이토 고키 / 이복연(개앞맵시)역
    출판 : 한빛미디어 2017.01.03
    상세보기

    댓글

dokylee's Tech Blog