본문 바로가기
First step/AI 기초반

[TIL]21.07.23 mnist 사용 기초

by Joshua21 2021. 7. 23.

0~9까지 의 숫자를 사람이 손필기한 데이터를 학습해서 실제손글씨로 쓴 숫자를 구별하는지 해보기

 

from tensorflow.keras.datasets import mnist

 

(X_train, Y_class_train), (X_test, Y_class_test) = mnist.load_data()

 

print('학습셋 이미지 수: %d 개'%(X_train.shape[0]))

print('테스트셋 이미지 수: %d 개'%(X_test.shape[0]))

 

import matplotlib.pyplot as plt

 

plt.imshow(X_train[0],cmap='Greys')

plt.show()

 

 

import sys

for x in X_train[0]:

  for i in x:

    # sys.stdout.write('%d\t'%i)

    sys.stdout.write('%3d'%i)

  sys.stdout.write('\n')

 

 

X_train = X_train.reshape(X_train.shape[0],784)

print(X_train.shape)

 

X_test=X_test.reshape(X_test.shape[0],784).astype('float64')/255

 

print('class : %d'%(Y_class_train[0]))

 

#class 5 를 [0,0,0,0,1,0,0,0,0,0]로 바꿔야함

import tensorflow as tf

 

Y_train=tf.keras.utils.to_categorical(Y_class_train,10)

Y_test=tf.keras.utils.to_categorical(Y_class_test,10)

 

from tensorflow.keras.datasets import mnist

from tensorflow.keras.models import Sequential

from tensorflow.keras.layers import Dense

 

import sys

import matplotlib.pyplot as plt

import numpy as np

import tensorflow as tf

 

#seed 값 설정

seed=0

np.random.seed(seed)

tf.random.set_seed(seed)

 

#mnist 데이터셋 불러오기

(X_train, Y_class_train), (X_test, Y_class_test) = mnist.load_data()

 

# print('학습셋 이미지 수: %d 개'%(X_train.shape[0]))

# print('테스트셋 이미지 수: %d 개'%(X_test.shape[0]))

 

# #그래프로 확인하기

# import matplotlib.pyplot as plt

# plt.imshow(X_train[0],cmap='Greys')

# plt.show()

 

# #코드로 확인

# for x in X_train[0]:

#   for i in x:

#     # sys.stdout.write('%d\t'%i)

#     sys.stdout.write('%3d'%i)

#   sys.stdout.write('\n')

 

#차원 변환 과정

X_train = X_train.reshape(X_train.shape[0],784).astype('float64')/255

 

X_test=X_test.reshape(X_test.shape[0],784).astype('float64')/255

 

#class 5 를 [0,0,0,0,1,0,0,0,0,0]로 바꿔야함 바이너리화 과정

import tensorflow as tf

Y_train=tf.keras.utils.to_categorical(Y_class_train,10)

Y_test=tf.keras.utils.to_categorical(Y_class_test,10)



model= Sequential()

model.add(Dense(512, input_dim=784,activation='relu'))

model.add(Dense(10,activation = 'softmax'))

model.compile(loss='categorical_crossentropy',optimizer='adam',metrics=['accuracy'])

 

import os

MODEL_DIR='./model/'

if not os.path.exists(MODEL_DIR):

  os.mkdir(MODEL_DIR)

 

modelpath='./model/{epoch:02d}-{val_loss:.4f}.hdf5'

Checkpointer= ModelCheckpoint(filepath=modelpath, monitor='val_loss', verbose=0,save_best_only=True)



#자동 중단 설정

early_stopping_callback=EarlyStopping(monitor='val_loss',patience=10)



history=model.fit(X_train, Y_train , validation_data=(X_test,Y_test), epochs=30,

                  batch_size=200,verbose=0, callbacks=[early_stopping_callback,Checkpointer])

 

print('\n Test Accuracy : %.4f'%(model.evaluate(X_test, Y_test)[1]))

 

y_vloss=history.history['val_loss']

y_loss=history.history['loss']

 

 

 

#x값을 지정하고 정확도는 파랑 오차를 빨강 으로 표시

 

x_len=np.arange(len(y_loss))

plt.plot(x_len, y_vloss,marker='.',c='red',label='Testset_loss')

plt.plot(x_len,y_loss,'o',c='blue',label='Trainset_loss')

 

plt.legend()

plt.grid()

plt.xlabel('epoch')

plt.ylabel('loss')

plt.show()

 

#학습결과 확인하기

import tensorflow as tf

import sys

import os

from tensorflow.keras.models import load_model

 

import cv2

import matplotlib.pyplot as plt

import numpy as np

 

model= load_model('/content/drive/MyDrive/Colab Notebooks/15-0.0595.hdf5')

model.summary()

 

test_num1=cv2.imread('/content/drive/MyDrive/Colab Notebooks/dataset/0.jpg')

test_num2=cv2.imread('/content/drive/MyDrive/Colab Notebooks/dataset/2.jpg')

test_num3=cv2.imread('/content/drive/MyDrive/Colab Notebooks/dataset/3.jpg')

test_num4=cv2.imread('/content/drive/MyDrive/Colab Notebooks/dataset/6.jpg')



test_num1=cv2.cvtColor(test_num1, cv2.COLOR_BGR2GRAY)

test_num2=cv2.cvtColor(test_num2, cv2.COLOR_BGR2GRAY)

test_num3=cv2.cvtColor(test_num3, cv2.COLOR_BGR2GRAY)

test_num4=cv2.cvtColor(test_num4, cv2.COLOR_BGR2GRAY)

 

#위과정을 거치면 색상이 반전됨 -> 아래에서 가시 색상을 반전

test_num1= 255 - test_num1

test_num2= 255 - test_num2

test_num3= 255 - test_num3

test_num4= 255 - test_num4

 

plt.imshow(test_num1,cmap='Greys')

plt.show()

plt.imshow(test_num2,cmap='Greys')

plt.show()

plt.imshow(test_num3,cmap='Greys')

plt.show()

plt.imshow(test_num4,cmap='Greys')

plt.show()

 

#학습했을때랑 같은 데이터 타입으로 만들어줌

test_num1= test_num1.reshape(1,784).astype('float64')/255

test_num2= test_num2.reshape(1,784).astype('float64')/255

test_num3= test_num3.reshape(1,784).astype('float64')/255

test_num4= test_num4.reshape(1,784).astype('float64')/255

 

print('The Answer 0 is ' , model.predict_classes(test_num1))

print('The Answer 2 is ' , model.predict_classes(test_num2))

print('The Answer 3 is ' , model.predict_classes(test_num3))

print('The Answer 6 is ' , model.predict_classes(test_num4))

 

#반복문으로 처리

import tensorflow as tf

import sys

import os

from tensorflow.keras.models import load_model

 

import cv2

import matplotlib.pyplot as plt

import numpy as np

 

#모델을 로드했으면 꼭 summary로 확인해볼것

model= load_model('/content/drive/MyDrive/Colab Notebooks/15-0.0595.hdf5')

model.summary()

 

n=3 # 내가 가져올 데이터의 양

test_num=[[0]*n] for _ in range(n)

 

test_num[0]=cv2.imread('/content/drive/MyDrive/Colab Notebooks/dataset/0.jpg')

test_num[1]=cv2.imread('/content/drive/MyDrive/Colab Notebooks/dataset/2.jpg')

test_num[2]=cv2.imread('/content/drive/MyDrive/Colab Notebooks/dataset/3.jpg')

 

for i in range(n):

  test_num[i]=cv2.cvtColor(test_num[i], cv2.COLOR_BGR2GRAY)

  test_num[i]= 255 - test_num[i]

  plt.imshow(test_num[i],cmap='Greys')

  plt.show()

  test_num[i]= test_num[i].reshape(1,784).astype('float64')/255

  print('The Answer is ' , model.predict_classes(test_num[i]))

 

'First step > AI 기초반' 카테고리의 다른 글

[TIL]21.07.27 CNN 기초2  (0) 2021.07.27
[TIL]21.07.26 CNN  (0) 2021.07.26
[TIL]21.07.21openCV 기초  (0) 2021.07.21
[TIL]21.07.20TCP/IP 기초 예외처리  (0) 2021.07.20
[TIL] 21.07.19pandas로 웹크롤링  (0) 2021.07.19