본문 바로가기
Coding/AI

mnist로 이미지 학습하고 인식하기

by 루민즈 2023. 10. 19.
반응형

안녕하세요 

이제 본격적으로 mnist를 모델에 학습하고 인식해봅시다. 

데이터 전처리에 대한 자세한 내용은 다음 포스팅을 참고해주세요 

https://ruminz.tistory.com/282 (이미지 딥러닝 기초 mnist 써보기)

 

mnist 데이터 전처리

먼저 관련 라이브러리를 임포트해줍니다. 

from tensorflow.keras.datasets import mnist 
from tensorflow.keras.utils import to_categorical

import matplotlib.pyplot as plt 
import sys

 

그다음 mnist 데이터셋을 불러온다음 학습셋과 테스트셋으로 저장합니다. 그다음 몇 개의 이미지로 구성되어있는지 출력합니다. 

 

(X_train,y_train),(X_test,y_test) = mnist.load_data()

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

 

 

출력을 해봅시다. 그리고 이미지가 어떠한 숫자로 이루어져있는지도 출력해봅시다. 

 

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

for x in X_train[0]:
  for i in x:
    sys.stdout.write("%-3s"  % i)
  sys.stdout.write('\n');

 

차원 변환을 해줍니다. 기존 가로 세로 28 * 28로 이루어진 2차원 배열을 1차원으로 변경해줍니다. 

그리고 클래스 값을 확인후 원핫인코딩을 적용한다음 출력을 해봅시다. 

 

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

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

print("class : %d " % (y_train[0]))

y_train = to_categorical(y_train, 10)
y_test = to_categorical(y_test,10)

print(y_train[0])

 

mnist 기본 프레임 만들기

 

이제 전처리를 마친 데이터를 학습시켜서 인식시켜봅시다. 관련 라이브러리를 임포트 해줍니다. 

그다음 모델 구조를 설정해줍시다. 

은닉층 512개 입력층 784개 출력층은 10개로 설정하였습니다. 

활성화 함수로 렐루랑 소프트맥스를 사용하였습니다. 

 

from tensorflow.keras.models import Sequential 
from tensorflow.keras.layers import Dense 
from tensorflow.keras.callbacks import ModelCheckpoint,EarlyStopping

import matplotlib.pyplot as plt 
import numpy as np
import os 

model = Sequential()
model.add(Dense(512,input_dim=784, activation='relu'))
model.add(Dense(10, activation='softmax'))
model.summary()

 

그럼 다음과 같이 모델에 대한 요약된 정보가 나타납니다.                     

 

이제 모델 컴파일 환경을 설정해주고 모델 최적화를 설정합니다. 그다음 모델을 실행하고 정확도를 출력합니다. 

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

modelpath = "./MNIST_MLT.hdf5"
checkpointer = ModelCheckpoint(filepath=modelpath,monitor='val_loss', 
                               verbose=1,save_best_only=True)
early_stopping_callback = EarlyStopping(monitor='val_loss',patience=10)

history = model.fit(X_train,y_train,validation_split=0.25,epochs=30, batch_size=200,verbose=0,callbacks=[early_stopping_callback,checkpointer])

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

modelpath = "./MNIST_MLT.hdf5": 모델의 가중치를 저장할 파일 경로를 정의합니다. 모델의 학습 중에 가중치를 저장하고 나중에 재사용할 수 있도록합니다

checkpointer = ModelCheckpoint(filepath=modelpath, monitor='val_loss', verbose=1, save_best_only=True): ModelCheckpoint 콜백을 설정합니다. 이 콜백은 학습 중에 모델의 상태를 모니터링하고, 검증 데이터의 손실(val_loss)을 기준으로 모델의 최상의 성능을 달성할 때마다 모델의 가중치를 저장합니다. filepath는 모델 가중치를 저장할 파일 경로를 나타내며, monitor는 모델의 어떤 지표를 기준으로 최적 모델을 결정할 것인지를 나타냅니다. verbose는 저장 작업의 진행 상황을 표시하고, save_best_only는 가장 좋은 모델만 저장할지 여부를 결정합니다

early_stopping_callback = EarlyStopping(monitor='val_loss', patience=10): EarlyStopping 콜백을 설정합니다. 이 콜백은 검증 데이터의 손실(val_loss)을 모니터링하고, 손실이 일정 기간(patience=10) 동안 개선되지 않으면 학습을 조기 중단합니다. 이렇게 하면 모델이 과적합되는 것을 방지할 수 있습니다.

 

그다음 오차를 저장하고 그래프로 출력해봅시다. 

y_vloss = history.history['val_loss']
y_loss = history.history['loss']

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,marker='.',c="blue",label='Trainset_loss')

plt.legend(loc='upper right')
plt.grid()
plt.xlabel('epoch')
plt.ylabel('loss')
plt.show()

 

다음과 같이 그래프가 출력되는걸 확인할수있습니다. 

 


Post

다음글 무직자 대출 알아보기 >