일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
- 알고리즘
- 텐서플로우
- 백준알고리즘
- 공부
- 프로그래밍
- 턱걸이
- linux
- 프로세스
- Computer Vision
- error
- 운영체제
- CV
- Windows10
- 영상처리
- 시스템프로그래밍
- shell
- 코딩
- 학습
- 리눅스
- C++
- python
- c
- OpenCV
- TensorFlow
- Windows 10
- 백준
- C언어
- 쉘
- 딥러닝
- 회귀
- Today
- Total
줘이리의 인생적기
[tensorflow 19] Fashion MNIST01 본문
이제 또 다른 다항분류 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_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 |