Studio KimHippo :D

[AI / DL / Keras] 1.fashion mnist 데이터셋 분류 본문

Artificial Intelligence/Deep Learning

[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)

Comments