줘이리의 인생적기

[tensorflow 19] Fashion MNIST01 본문

공부/tensorflow

[tensorflow 19] Fashion MNIST01

줘이리 2021. 5. 20. 23:29
728x90

이제 또 다른 다항분류 Fashion MNIST를 공부해보겠습니다.

 

MNIST란 손으로 쓴 숫자들로 이루어진 대형 데이터베이스이며, 머신러닝의 고전적인 문제입니다

 

이 영향을 받아 만들어진 Fashion MNIST는 옷, 신발, 가방의 이미지 데이터베이스입니다.

 

Fashion MNIST의 특징은 그레이스케일 이미지이며, 10개의 범주, 28 * 28 크기의 픽셀을 가지고 있다는 점입니다.

 

Fashion MNIST 데이터셋은 tf.keras에 탑재되어 있으니 바로 시작해보겠습니다.

 


데이터를 먼저 불러오고, 정규화를 한 다음 첫 번째 데이터를 먼저 확인해보겠습니다.

 

import tensorflow as tf

fashion_mnist = tf.keras.datasets.fashion_mnist
(train_X, train_Y), (test_X, test_Y) = fashion_mnist.load_data()

print("---------데이터 개수---------")
print("train 데이터 :", len(train_X), "test 데이터 :", len(test_X))

#정규화
train_X = train_X / 255.0
test_X = test_X / 255.0

print(train_X[0])

 

train 데이터는 6000개, test 데이터는 1000개로 구성되어 있습니다.

 

정규화를 한 후 확인해보니 첫 번째 데이터에 0이 굉장히 많네요. 이런 행렬을 희소행렬이라고 합니다.

https://ko.wikipedia.org/wiki/%ED%9D%AC%EC%86%8C%ED%96%89%EB%A0%AC

 

희소행렬 - 위키백과, 우리 모두의 백과사전

위키백과, 우리 모두의 백과사전. 희소행렬의 한 예. 검은 색은 0이 아닌 값을 가진다는 것을 의미한다. 희소행렬(sparse matrix)은 행렬의 값이 대부분 0인 경우를 가리키는 표현이다.[1] 그와 반대되

ko.wikipedia.org

희소행렬에 대해서는 위 사이트를 참조하시면 되겠습니다.


데이터 낭비를 줄이기 위해 기존에 사용했던 원-핫 인코딩이 아니라

 

0이 아닌 숫자의 위치와 값만 저장하는 sparse_categorical_crossentropy를 사용해보도록 하겠습니다.

 

또 모델 구성은 다차원 데이터를 1차원으로 정렬하는 Flatten 레이어를 사용하겠습니다.

 

import tensorflow as tf

fashion_mnist = tf.keras.datasets.fashion_mnist
(train_X, train_Y), (test_X, test_Y) = fashion_mnist.load_data()

print("---------데이터 개수---------")
print("train 데이터 :", len(train_X), "test 데이터 :", len(test_X))

#정규화
train_X = train_X / 255.0
test_X = test_X / 255.0

#모델
model = tf.keras.Sequential([
    tf.keras.layers.Flatten(input_shape=(28,28)),
    tf.keras.layers.Dense(units=128, activation='relu'),
    tf.keras.layers.Dense(units=10, activation='softmax')
])

model.compile(optimizer=tf.keras.optimizers.Adam(), loss='sparse_categorical_crossentropy', metrics=['accuracy'])

history = model.fit(train_X, train_Y, epochs=25, validation_split=0.25)

 

이렇게 구성하면 되겠죠.

 

시각화부분을 추가하여 학습을 시켜보도록 하겠습니다.

 

import tensorflow as tf
import matplotlib.pyplot as plt


fashion_mnist = tf.keras.datasets.fashion_mnist
(train_X, train_Y), (test_X, test_Y) = fashion_mnist.load_data()

print("---------데이터 개수---------")
print("train 데이터 :", len(train_X), "test 데이터 :", len(test_X))

#정규화
train_X = train_X / 255.0
test_X = test_X / 255.0

#모델
model = tf.keras.Sequential([
    tf.keras.layers.Flatten(input_shape=(28,28)),
    tf.keras.layers.Dense(units=128, activation='relu'),
    tf.keras.layers.Dense(units=10, activation='softmax')
])

model.compile(optimizer=tf.keras.optimizers.Adam(), loss='sparse_categorical_crossentropy', metrics=['accuracy'])

history = model.fit(train_X, train_Y, epochs=25, validation_split=0.25)

#시각화
plt.figure(figsize=(12,4))

#loss 시각화
plt.subplot(1, 2, 1)
plt.plot(history.history['loss'], 'b-', label='loss')
plt.plot(history.history['val_loss'], 'r--', label='val_loss')
plt.xlabel('Epoch')
plt.legend()

#accuracy 시각화
plt.subplot(1, 2, 2)
plt.plot(history.history['accuracy'], 'g-', label='accuracy')
plt.plot(history.history['val_accuracy'], 'k--', label='val_accuracy')
plt.xlabel('Epoch')
plt.ylim(0.7, 1)
plt.legend()

plt.show()

#평가
model.evaluate(test_X, test_Y)

 

학습이 제법 잘 되었으나, 검증데이터의 손실이 조금의 과적합 현상이 일어난 것을 볼 수 있습니다.

 

test 데이터셋에 대한 평가도 확인해보겠습니다.

 

88.2퍼센트의 정확도가 나왔네요

 

계속 공부하면서 정확도를 올릴 수 있는 방법은 무엇인가 알아보도록 하겠습니다.

'공부 > tensorflow' 카테고리의 다른 글

[tensorflow 21] 레이어  (0) 2021.05.24
[tensorflow 20] CNN - 특징 추출  (0) 2021.05.21
[tensorflow 18] 다항분류  (0) 2021.05.20
[tensorflow 17] 이항 분류02  (0) 2021.05.18
[tensorflow 16] 이항 분류01  (0) 2021.05.17