본문 바로가기
Make the Learning Curve/Data Science

[CNN] CNN을 이용한 MNIST-3 // MNIST Predict

by 에이도 2020. 12. 18.

 

 

 

 

 

2020/12/18 - [2020/데이터사이언스(DL,ML)] - [CNN] CNN을 이용한 MNIST-1 // MNIST 이해 및 데이터 확인

 

[CNN] CNN을 이용한 MNIST-1 // MNIST 이해 및 데이터 확인

1) MNIST 데이터베이스란? MNIST 데이터베이스 (Modified National Institute of Standards and Technology database)는 손으로 쓴 숫자들로 이루어진 대형 데이터베이스이며, 다양한 화상 처리 시스템을 트레이닝..

lheon.tistory.com

 

2020/12/18 - [2020/데이터사이언스(DL,ML)] - [CNN] CNN을 이용한 MNIST-2 // 모델링

 

[CNN] CNN을 이용한 MNIST-2 // 모델링

2020/12/18 - [2020/데이터사이언스(DL,ML)] - [CNN] CNN을 이용한 MNIST-1 // MNIST 이해 및 데이터 확인 [CNN] CNN을 이용한 MNIST-1 // MNIST 이해 및 데이터 확인 1) MNIST 데이터베이스란? MNIST 데이터베이..

lheon.tistory.com


앞에서 만든 모델을 통해서 예측을 진행해 보겠습니다!

 

 

학습모델을 통해 예측하는 포스팅은 Top-down 방식으로 진행하겠습니다! 


예측 함수 모델링 및 순서

def predict_image_sample(model,X_test, y_test, test_id= -1 ):
    if test_id <0 :
        from random import randrange
        test_sample_id = randrange(10000)
    else:
        test_sample_id = test_id
    
    test_image =X_test[test_sample_id]
    plt.imshow(test_image, cmap = 'gray')
    
    test_image = test_image.reshape(1,28,28,1)
    
    y_actual = y_test[test_sample_id]
    print('y_actual number = ', y_actual)
    
    y_pred = model.predict(test_image)
    print("y_pred = ", y_pred)
    y_pred = np.argmax(y_pred, axis = 1)[0]
    print('y_pred number = ', y_pred)
    
   
if __name__ == '__main__' :
    (X_train, y_train), (X_test, y_test) = mnist.load_data()
    model = load_model('mnist_model')
    predict_image_sample(model,X_test, y_test,  test_id= i)
  1. tensorflow 내에 있는 mnist 데이터를 로딩

  2. model은 실행하면 위에서 epoch를 하며 학습을
    하나 예측할때마다 반복하면 시간이 많이 걸리게 됩니다.

  3. 따라서 위에서 실행한 학습(train) 모델을 저장해놓고
    그 학습 모델을 불러오도록 했습니다. (mnist_model)

  4. predicton 함수를 실행합니다.

 


 

 

1. Predicton 함수 분해 -1 

test_id = -1
if test_id < 0:
from random import randrange
test_sample_id = randrange(10000)
else:
test_sample_id = test_id

 

처음 test_id 를 0보다 작은 수를 임의로 지정해서
랜덤 하게 10000개의 숫자 중에서 하나의 숫자를 뽑아서
그 숫자에 해당하는 샘플을 시험해보기 위해 test_sample_id라는 변수에 숫자를 할당합니다.

(이때 10,000은 test의 데이터 개수입니다.)


 

2. Predicton 함수 분해 -2 

test_image = X_test[test_sample_id]

plt.imshow(test_image, cmap='gray')

test_image = test_image.reshape(1,28,28,1)
  1. 위에서 구한 랜덤 숫자에 대한 X_test내의 이미지를 test_image 변수에 할당합니다.

  2. test_image를 plt.imshow를 통해 표현합니다.

  3. test 이미지는 3차원으로 reshape 합니다.

    {reshae(이미지 개수, 차원(28x28x1))}


3. Predicton 함수 분해 -3

y_actual = y_test[test_sample_id]
print("y_actual number=", y_actual)

y_pred = model.predict(test_image)
print("y_pred=", y_pred)
y_pred_num = np.argmax(y_pred, axis=1)[0]
print("y_pred number=", y_pred_num)

 

  1. 해당하는 y_test의 실제값을 y_actual에 할당하고 출력합니다.

  2. 위에서 구한 test_image를 통해 예측을 합니다.

  3. predict함수를 통한 예측 후 예측값을 구하고 출력합니다.

    이때 y_pred는 값이 아닌 길이 1x10의 행렬이 나옵니다.
    -> output layer의 10개의 노드(0부터 9)의 각 확률입니다.
    (따라서 각 element의 값은 0부터 1 사이이고, 모든 element의 sum = 1입니다.)

     

  4. 그리고 예측값 중 가장 높은 값을 출력하기 위해 numpy의 argmax함수를 통해

    위에서 구한 행렬 중 가장 높은 값을 출력합니다.

    (이때 index 0을 한 이유는 argmax함수로 인해 가장 높은 값이 맨 앞으로 오기 때문입니다. )

  5. 그중 가장 높은 값을 가지는 노드가 예측값으로 출력이 됩니다.


4. Predicton 함수 결합

def predict_image_sample_(model, X_test, y_test, test_id=-1):
    if test_id < 0:
        from random import randrange
        test_sample_id = randrange(10000)
    else:
        test_sample_id = test_id
        
    test_image = X_test[test_sample_id]
    
    plt.imshow(test_image, cmap='gray')
    
    test_image = test_image.reshape(1,28,28,1)

    y_actual = y_test[test_sample_id]
    print("y_actual number=", y_actual)
    
    y_pred = model.predict(test_image)
    print("y_pred=", y_pred)
    y_pred_num = np.argmax(y_pred, axis=1)[0]
    print("y_pred number=", y_pred_num)
    
    return y_actual, y_pred_num

이미지를 통한 예측 함수에서

실제값(y_actual)과 예측값(y_pred_num)을 리턴 받아 

횟수를 세워 정확도를 구해보겠습니다!

 


 

5. CNN 이용한 MNIST 실행

if __name__ == '__main__' :
    all, n = 0,0
    (X_train, y_train), (X_test, y_test) = mnist.load_data()
    model = load_model('mnist.model')
    predict_image_sample(model, X_test, y_test)
    for i in range(500):
        all +=1
        y_actual, y_pred_num = predict_image_sample_(model, X_test, y_test, test_id= i)
        if y_actual == y_pred_num:
            n += 1 
        else : pass
    print('총횟수 = {} , 맞춘횟수={} , 정확도(Accuracy)={} '.format(all,n, (n/all)*100 ) )

500번 진행하였고, 491번 예측에 성공했습니다.

약 98.2%의 정확도를 보여주는 모델을 만들었습니다!

 

 

이렇게 CNN을 이용한 MNIST 훈련 및 예측을 해보았습니다.

 

감사합니다 :) 

 

github.com/heonsooo/DataScience_Introduction/tree/master/Deep_Learning/CNN_MNIST

 

heonsooo/DataScience_Introduction

2020-2 데이터사이언스개론. Contribute to heonsooo/DataScience_Introduction development by creating an account on GitHub.

github.com

 

댓글