텐서플로우 Classification 예제 (Fashion MNIST)


텐서플로우 Classification 예제
텐서플로우를 이용하여 Fashion MNIST 데이터셋을 분류하는 예제에 대해서 설명드리도록 하겠습니다. Fashion MNIST 데이터셋은 셔츠, 치마, 코트, 신발 등의 의류 이미지입니다. Softmax Classifier를 뉴럴(Neural) 네트워크를 만들어서 분류해 보도록 하겠습니다. 이 글에서 사용된 예제 소스코드는 페이지 하단에 함께 첨부하였습니다.

이 예제를 실행하기 위해서는 Tensorflow를 포함하여 matplotlib 패키지가 설치되어야 합니다. conda 명령어로 matplotlib 패키지를 설치하기 위해서는 다음 명령어를 사용하면 됩니다. conda 명령어 사용법에 대해서는 아래의 글을 참고해 주시기 바랍니다.

Anaconda 사용법 (conda 명령어)

$ conda install matplotlib

텐서플로우 Classification 예제

Fashion MNIST

기존 MNIST 데이터셋의 경우 0 ~ 9 까지 필기체 숫자 이미지를 나타내는 데이터셋입니다. Computer Vision 분야에서 가장 기초저적인 데이터셋으로 사용되어 왔습니다.

하지만 최근에는 Fashion MNIST 라는는 옷 종류의 이미지를 나타내는 데이터셋으로 대체하여 많이 사용되고 있습니다.

텐서플로우 Classification 예제
(출처 : https://github.com/zalandoresearch/fashion-mnist)

이 글에서는 Fashion MNIST 데이터셋 중에서 60,000개의 이미지를 뉴럴 네트워크를 학습하는데 사용하고, 10,000개의 이미지를 학습된 네트워크를 평가 하는데 사용할 것입니다.

텐서플로우에서는 Fashion MNIST 데이터 셋을 아래의 코드를 사용하여 바로 사용할 수 있습니다.

# TensorFlow and tf.keras
import tensorflow as tf
from tensorflow import keras

# Helper libraries
import numpy as np
import matplotlib.pyplot as plt

fashion_mnist = keras.datasets.fashion_mnist

(train_images, train_labels), (test_images, test_labels) = fashion_mnist.load_data()

Fashion MNIST 데이터셋에서 10개의 카테고리는 아래와 같습니다.

class_names = ['T-shirt/top', 'Trouser', 'Pullover', 'Dress', 'Coat',
               'Sandal', 'Shirt', 'Sneaker', 'Bag', 'Ankle boot']

아래의 코드를 이용하여 학습데이터셋의 이미지 1개를 출력해서 확인해 보도록 하겠습니다.

plt.figure()
plt.imshow(train_images[0])
plt.colorbar()
plt.grid(False)
plt.show()

실행된 이미지는 아래와 같습니다. 각각의 픽셀 이미지는 0~ 255까지의 값이 저장되어 있습니다.

텐서플로우 Classification 예제

모델을 학습하고 평가를 하기 전에 전처리 단계로 이 값을 최대값인 255으로 나눠서 범위를 조절하도록 하겠습니다.

train_images = train_images / 255.0
test_images = test_images / 255.0

데이터셋을 전처리하여 모델을 학습하게 되면, 모델을 평가하거나 테스트할 때에도 반드시 동일한 방법으로 전처리 후 평가 또는 테스트해야 한다는 점에 주의하셔야 합니다.

전처리 후 다음 코드를 추가하여, 첫 25개의 이미지와 카테고리를 출력하여 확인해 보도록 하겠습니다.

plt.figure(figsize=(10,10))
for i in range(25):
    plt.subplot(5,5,i+1)
    plt.xticks([])
    plt.yticks([])
    plt.grid(False)
    plt.imshow(train_images[i], cmap=plt.cm.binary)
    plt.xlabel(class_names[train_labels[i]])
plt.show()
텐서플로우 Classification 예제

모델 만들기

모델을 만들기 위해서는 각 레이어를 설정하고 모델을 컴파일 해야 합니다. 각 단계를 나눠서 설명드리도록 하겠습니다.

레이어 설정

뉴럴 네트워크에서 기본 블럭 단위는 레이어 입니다. 대부분의 딥러닝의 모델은 이러한 레이어를 결합하여 전체 뉴럴 네트워크를 구성하게 됩니다. tf.keras.layers.Dense 를 포함하여 대부분의 레이어에서는 모델 학습과정에서 값이 업데이트 되는 파라미터 값을 갖고 있습니다.

model = keras.Sequential([
keras.layers.Flatten(input_shape=(28, 28)),
keras.layers.Dense(128, activation=tf.nn.relu),
keras.layers.Dense(10, activation=tf.nn.softmax)
])

이 글에서 설명드릴 Classifier 뉴럴 네트워크에서는 위와 같은 레이어를 갖는 모델입니다.

첫번째 레이어에서는 2차원 배열(28pixel x 28pixel)를 입력으로 받고 1 차원 배열(784 pixel)로 변경하는 keras.layers.Flatten 레이어가 사용되었습니다. 이 레이어는 파라미터 업데이트 없이 단순히 배열 형태만 변경하는 역할 을 합니다.

그 다음 레이어는 2개의 tf.keras.layers.Dense 레이어가 순차적으로 사용되었습니다. 첫번째 Dense 레이어는 128 개의 노드를 갖고, 두번째 레이어는 10개의 Softmax 레이어를 갖습니다.

마지막 레이어를 통과하게 되면 각각의 카테고리 마다 확률값을 갖는 값이 저장되는데, 이 값을 모두 합치면 1이되게 됩니다.
이 확률 값이 가장 높은 카테고리가 최종적으로 판단되는 카테고리입니다.

모델 컴파일

모델을 학습하기 전에 몇 가지 추가 설정이 필요한데, 이 설정들은 모델 컴파일에 사용되게 됩니다.

  • Loss function : 손실값을 측정하는데 사용됩니다.
  • Optimizer : 이 함수는 모델을 학습할 때 사용됩니다.
  • Metrics : 학습과 테스트 하는데 모니터링 될 때 사용되는 값입니다.
model.compile(optimizer='adam', 
              loss='sparse_categorical_crossentropy',
              metrics=['accuracy'])

모델 학습

뉴럴 네트워크 모델을 학습하기 위해서는 아래의 단계가 필요합니다.

  1. 모델에 데이터 입력, 이 글에서는 train_images, train_labels 배열로 전달하게 됩니다.
  2. 이미지와 라벨 학습하기
  3. 학습된 모델 테스트하기. 학습을 위해서 test_images 이미지가 사용됩니다. 예측된 결과와 test_labels 배열을 이용하여 모델의 정확도를 측정하게 됩니다.
model.fit(train_images, train_labels, epochs=5)
Epoch 1/5
60000/60000 [==============================] - 6s 105us/sample - loss: 0.5000 - acc: 0.8241
Epoch 2/5
60000/60000 [==============================] - 6s 99us/sample - loss: 0.3709 - acc: 0.8661
Epoch 3/5
60000/60000 [==============================] - 6s 98us/sample - loss: 0.3375 - acc: 0.8771
Epoch 4/5
60000/60000 [==============================] - 6s 98us/sample - loss: 0.3136 - acc: 0.8852
Epoch 5/5
60000/60000 [==============================] - 6s 98us/sample - loss: 0.2940 - acc: 0.8923
10000/10000 [==============================] - 1s 57us/sample - loss: 0.3565 - acc: 0.8732

확습을 진행하는 과정에서 세부적인 로그가 출력됩니다. 위의 실행결과를 보면 모델의 정확도가 약 0.88 (88%) 정도 되고 있음을 알 수 있습니다.

모델 평가하기

모델을 평가 할 때에는 학습에 사용되지 않은 테스트 데이턴셋으로 평가합니다. 테스트 데이터셋으로 평가 한 결과는 아래와 같습니다.

test_loss, test_acc = model.evaluate(test_images, test_labels)

print('Test accuracy:', test_acc)
Test accuracy: 0.8732

모델 예측하기

모델에 데이터를 입력하여 결과를 예측해 보도록 하겠습니다.

predictions = model.predict(test_images)
predictions[0]

테스트 데이터셋 중에서 첫번쩨 데이터셋의 에측 결과를 출력하면 아래와 같습니다. 각각의 카테고리별로 예측 확률이 나타난 것을 알 수 있습니다.

[[4.5809134e-06 4.9238210e-08 5.1085558e-06 1.4860933e-06 1.1338535e-06
  1.5319642e-03 3.8497355e-06 6.6312425e-02 1.7938695e-05 9.3212152e-01]]

그리고 다음 코드를 이용하여 확률이 가장 높은 카테고리를 출력해 보도록 하겠습니다.

np.argmax(predictions[0])
9

그리고 실제 이 카테고리가 일치하는지 라벨 내용을 출력해 보도록 하겠습니다.

test_labels[0]
9

예측된 카테고리와 정답이 일치함을 알 수 있습니다. 이글에 사용된 소스코드는 아래의 링크에서 다운 받으실 수 있습니다.

https://github.com/tensorflow/docs/blob/master/site/en/tutorials/keras/basic_classification.ipynb

( 본문 인용시 출처를 밝혀 주시면 감사하겠습니다.)