Studio KimHippo :D
[AI / DL / Keras] 1.fashion mnist 데이터셋 분류 본문
[AI / DL / Keras] 1.fashion mnist 데이터셋 분류
김작은하마 2019. 7. 9. 23:28필요 패키지로드
# -*- coding: utf-8 -*-
from keras.layers import Dense, Activation,Flatten
from keras.datasets import fashion_mnist
from keras.models import Sequential
from keras.utils import np_utils
import matplotlib.pyplot as plt
import tensorflow as tf
import seaborn as sns
import numpy as np
sns.set()
plt.style.use('ggplot')
데이터셋 생성
# NOTE : 데이터셋 생성
(train_img, train_lab), (test_img, test_lab) = fashion_mnist.load_data()
# NOTE
# train_lab은 0에서 사이의 정수, train_img는 0~255 사이의 픽셀값
print(train_lab)
train_img.shape, train_lab.shape
class_names = ['T-shirt/top', 'Trouser', 'Pullover', 'Dress', 'Coat',
'Sandal', 'Shirt', 'Sneaker', 'Bag', 'Ankle Boot']
데이터 확인
# NOTE
# train set의 첫 번째 이미지를 보여줌.
# 그래프를 보면 0 ~ 255사이의 값이 나타남을 보여줌.
plt.figure()
plt.imshow(train_img[0])
plt.colorbar()
plt.grid(False)
# NOTE : Normalization(정규화)
train_img = train_img / 255.0
test_img = test_img / 255.0
# NOTE
# train set에서 처음 25개의 이미지와 클래스 이름 출력
plt.figure(figsize=(10, 10))
for img in range(25):
plt.subplot(5, 5, img+1)
plt.xticks([])
plt.yticks([])
plt.grid(False)
plt.imshow(train_img[img], cmap=plt.cm.binary)
plt.xlabel(class_names[train_lab[img]])
Out [1] :
Out [2] :
모델 생성 및 학습
# NOTE : model 구성
# NOTE : layer 설정
# NOTE
# Flatten : 2차원 배열을 1차원 배열로 만들어줌.
model = Sequential([
Flatten(input_shape = (28, 28)),
Dense(128, activation=tf.nn.relu),
Dense(10, activation=tf.nn.softmax)])
# NOTE
# 첫 번째 Dense 층은 128개의 신경망 노드를 가짐.
# 두 번째 Dense 층은 10개의 신경망 노드를 가진 softmax 층.
# 이 층은 10개의 노드의 확률을 반환하고, 합은 1임.
model.compile(
loss = 'sparse_categorical_crossentropy',
optimizer = 'adam', metrics = ['accuracy'])
# NOTE
# loss : 훈련하는 동안 모델의 오차를 측정하는 손실함수를 설정하는 매개변수
# optimizer : 손실함수 값을 최소화 시키는 최적화함수를 설정하는 매개변수
# metrics : 훈련 단계와 테스트 단계를 모니터링
# 이 경우에는 정확도를 사용.
# NOTE : 훈련 데이터를 모델에 주입
# 모델이 이미지와 레이블을 매핑하는 방법을 배움.
model.fit(train_img, train_lab, epochs = 10)
Out [2] :
Epoch 1/10 60000/60000 [==============================] - 6s 95us/step - loss: 0.2835 - acc: 0.8968 Epoch 2/10 60000/60000 [==============================] - 5s 85us/step - loss: 0.2707 - acc: 0.8999 Epoch 3/10 60000/60000 [==============================] - 5s 85us/step - loss: 0.2589 - acc: 0.9038 Epoch 4/10 60000/60000 [==============================] - 6s 100us/step - loss: 0.2491 - acc: 0.9080 Epoch 5/10 60000/60000 [==============================] - 5s 89us/step - loss: 0.2401 - acc: 0.9118 Epoch 6/10 60000/60000 [==============================] - 5s 91us/step - loss: 0.2336 - acc: 0.9131 Epoch 7/10 60000/60000 [==============================] - 5s 92us/step - loss: 0.2253 - acc: 0.9161 Epoch 8/10 60000/60000 [==============================] - 5s 91us/step - loss: 0.2192 - acc: 0.9177 Epoch 9/10 60000/60000 [==============================] - 5s 90us/step - loss: 0.2108 - acc: 0.9210 Epoch 10/10 60000/60000 [==============================] - 5s 91us/step - loss: 0.2063 - acc: 0.9225
Out [3] :
10000/10000 [==============================] - 0s 34us/step
테스트 정확도 : 0.8874
정확도 평가 및 예측
# NOTE : 정확도 평가
test_loss, test_acc = model.evaluate(test_img, test_lab)
print('테스트 정확도 : ', test_acc)
# NOTE : 예측만들기
pred = model.predict(test_img)
pred_ind = np.argmax(pred[0])
print('Predict label : ',class_names[pred_ind])
print('Exact label : ', class_names[test_lab[0]])
pred[0]
# NOTE
# 9번째 인덱스 즉, Ankel Boot가 가장 높은 확률값을 보임.
Out [1] :
Predict label : Ankle Boot
Exact label : Ankle Boot
Out [2] :
array([1.0485628e-06, 8.1724592e-12, 9.8105712e-10, 3.9503190e-10,
4.8850087e-08, 1.8133660e-05, 2.2799888e-07, 2.6843237e-02,
2.8675396e-08, 9.7313732e-01], dtype=float32)
10개 범주의 신뢰도 그래프 그리는 함수
# NOTE : 10개의 신뢰도를 그래프로 그리기
def plot_img(in_data, pred_arr, true_lab, img):
pred_arr, true_lab, img = pred_arr[in_data], true_lab[in_data], img[in_data]
plt.grid(False)
plt.xticks([])
plt.yticks([])
plt.imshow(img, cmap = plt.cm.binary)
pred_lab = np.argmax(pred_arr)
if pred_lab == true_lab:
color = 'blue'
else:
color = 'red'
plt.xlabel('{} {:2.0f}%({})'.format(class_names[pred_lab],
100*np.max(pred_arr),
class_names[true_lab],
color = color))
def plot_value_arr(in_data, pred_arr, true_lab):
pred_arr, true_lab = pred_arr[in_data], true_lab[in_data]
plt.grid(False)
plt.xticks([])
plt.yticks([])
thisplot = plt.bar(range(10), pred_arr, color = '#777777')
plt.ylim([0, 1])
pred_lab = np.argmax(pred_arr)
thisplot[pred_lab].set_color('red')
thisplot[true_lab].set_color('blue')
함수 실험
# NOTE
# 0번째 원소의 이미지, 예측, 신뢰도 점수 배열 확인
in_data = 0
plt.figure(figsize = (6,3))
plt.subplot(1, 2, 1)
plot_img(in_data, pred, test_lab, test_img)
plt.subplot(1, 2, 2)
plot_value_arr(in_data, pred, test_lab)
# NOTE
# 12번째 원소의 이미지, 예측, 신뢰도 점수 배열 확인
in_data = 12
plt.figure(figsize=(6, 3))
plt.subplot(1, 2, 1)
plot_img(in_data, pred, test_lab, test_img)
plt.subplot(1, 2, 2)
plot_value_arr(in_data, pred, test_lab)
# NOTE
# 처음 x 개의 테스트 이미지와 예측 레이블, 진짜 레이블 출력
# 올바른 예측은 파랑색, 틀린 예측은 빨강색으로 표시
nrows = 5; ncols = 3
n_img = nrows * ncols
plt.figure(figsize = (2*2*ncols, 2*nrows))
for rep in range(n_img):
plt.subplot(nrows, 2*ncols, 2*rep + 1)
plot_img(rep, pred, test_lab, test_img)
plt.subplot(nrows, 2*ncols, 2*rep + 2)
plot_value_arr(rep, pred, test_lab)
Out [1] :
Out [2] :
Out [3] :
참고
Tensorflow Keras 튜토리얼 (https://www.tensorflow.org/tutorials/keras/basic_classification)