2020/12/18 - [2020/데이터사이언스(DL,ML)] - [CNN] CNN을 이용한 MNIST-1 // MNIST 이해 및 데이터 확인
2020/12/18 - [2020/데이터사이언스(DL,ML)] - [CNN] CNN을 이용한 MNIST-2 // 모델링
앞에서 만든 모델을 통해서 예측을 진행해 보겠습니다!
학습모델을 통해 예측하는 포스팅은 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)
-
tensorflow 내에 있는 mnist 데이터를 로딩
-
model은 실행하면 위에서 epoch를 하며 학습을
하나 예측할때마다 반복하면 시간이 많이 걸리게 됩니다. -
따라서 위에서 실행한 학습(train) 모델을 저장해놓고
그 학습 모델을 불러오도록 했습니다. (mnist_model) -
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)
-
위에서 구한 랜덤 숫자에 대한 X_test내의 이미지를 test_image 변수에 할당합니다.
-
test_image를 plt.imshow를 통해 표현합니다.
-
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)
-
해당하는 y_test의 실제값을 y_actual에 할당하고 출력합니다.
-
위에서 구한 test_image를 통해 예측을 합니다.
-
predict함수를 통한 예측 후 예측값을 구하고 출력합니다.
이때 y_pred는 값이 아닌 길이 1x10의 행렬이 나옵니다.
-> output layer의 10개의 노드(0부터 9)의 각 확률입니다.
(따라서 각 element의 값은 0부터 1 사이이고, 모든 element의 sum = 1입니다.) -
그리고 예측값 중 가장 높은 값을 출력하기 위해 numpy의 argmax함수를 통해
위에서 구한 행렬 중 가장 높은 값을 출력합니다.
(이때 index 0을 한 이유는 argmax함수로 인해 가장 높은 값이 맨 앞으로 오기 때문입니다. )
-
그중 가장 높은 값을 가지는 노드가 예측값으로 출력이 됩니다.
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
'Make the Learning Curve > Data Science' 카테고리의 다른 글
[Random Forest 개요] (0) | 2021.06.04 |
---|---|
Text Mining 개요 ( Bow, VSM, TF, IDF, TF-idf , IR) (0) | 2021.04.21 |
[CNN] CNN을 이용한 MNIST-2 // 모델링 (0) | 2020.12.18 |
[CNN] CNN을 이용한 MNIST-1 // MNIST 이해 및 데이터 확인 (0) | 2020.12.18 |
[딥러닝] Convolution and Pooling in CNN (0) | 2020.12.12 |
댓글