본문 바로가기

머신러닝공부

MNIST를 활용한 이미지 데이터 딥러닝 개발 프로세스2

728x90
반응형

Deep Learning MNIST Example

# 데이터 불러오기
import tensorflow as tf
import numpy as np
from tensorflow.keras.datasets import mnist

(x_train, t_train), (x_test, t_test) = mnist.load_data()

print('\ntrain shape = ', x_train.shape, ', Train label shape = ', t_train.shape)
print('\ntest shape = ', t_train.shape,', test label shape = ', t_train.shape)

print('\ntrin label = ', t_train) # 학습 데이터 정답 출력
print('\ntest label = ', t_test) # 테스트 데이터 정답 출력

# 데이터 확인
import matplotlib.pyplot as plt

plt.figure(figsize=(6,6))

for index in range(25): # 25개 이미지 출력
	plt.subplt(5, 5, index+1)
    plt.imshow(x_train[index], cmap='gray')
    plt.axis('off')
    plt.title(str(t_train[index])
plt.show()

# 데이터 전처리
x_train = (x_train-0.0)/(255.0-0.0) # 학습데이터 정규화
x_text = (x_text-0.0)/(255.0-0.0) # 테스트 데이터 정규화, 최대값 255, 최소값 0.0

t_train = tf.keras.utils.to_categorical(t_train, num_classes = 10) # 정답 데이터 원핫 인코딩
t_test = tf.keras.utils.to_categorical(t_test, num_classes = 10) # MNIST 정답 데이터는 0~9까지 총 10개의 숫자 가운데 하나이므로 num_classes = 10을 지정하여 10개의 리스트를 만들어서 원핫인코딩 수행

# 모델 구축
model = tf.keras.Sequential()
model.add(tf.keras.layers.Flatten(input_shape = (28, 28)) # 입력층
model.add(tf.keras.layers.Dense(100, activation = 'relu')) # 은닉층
model.add(tf.keras.layers.Dense(10, activation = 'softmax')) # 출력층

# 모델 컴파일
model.complie(optimizer = tf.keras.optimizers.Adam(learning_rate = 1e-3), loss = 'categorical_crossentropy', metrics = ['accuracy'] # 원핫인코딩방식
model.summary()

# 모델 학습
hist = model.fit(x_train, t_train, epochs = 30, validation_split = 0.3)

# 모델 (정확도) 평가
model.evaluate(x_test, t_test)

# 손실 및 정확도 시각화
plt.title('Loss')
plt.xlabel('epochs')
plt.ylabel('loss')
plt.grid()
plt.plot(hist.history['loss'], label='train loss')
plt.plt(hist.history['val_loss'], label = 'validation loss')
plt.legend(loc='best')
plt.show()

plt.title('Accuracy')
plt.xlabel('epochs')
plt.ylabel('accuracy')
plt.grid()
plt.plot(hist.history['accuracy'], label = 'train accuracy')
plt.plot(hist.history['val_accuracy'], label='validation accuracy')
plt.show()

# 혼동 행렬
from sklearn.metrics import confusion_matrix
import seaborn as sns

plt.figure(figsize = (6,6))
predicted_value = model.predict(x_test) # 테스트 입력 데이터에 대한 prediction 실행
cm = confusion_matrix(np.argmax(t_test, axis = -1), np.argmax(predicted_value, axis=-1) # 정답과 예측 답 비교

sns.heatmap(cm, annot=True, fmt='d')
plt.show()

print(cm)
print('\n')

for i in range(10):
print(('label = %d\t(%d%d)\taccuracy = %.3f')%(i, np.max(cm[i]), np.sum(cm[i]), np.max(cm[i])/np.sum(cm[i])))
반응형