패션 MNIST 데이터셋은 28x28 크기의 회색조 이미지로 구성된 10가지 패션 아이템 분류를 위한 데이터셋이다. 60000개의 훈련 데이터와 10000개의 테스트 데이터로 이루어져 있다.
from tensorflow import keras
(train_input, train_target), (test_input, test_target) = keras.datasets.fashion_mnist.load_data()
print(train_input.shape, train_target.shape)
#출력 (60000, 28, 28) (60000,)
print(test_input.shape, test_target.shape)
#출력 (10000, 28, 28) (10000,)
import matplotlib.pyplot as plt
fig, axs = plt.subplots(1, 10, figsize=(10, 10))
for i in range(10):
axs[i].imshow(train_input[i], cmap='gray_r')
axs[i].axis('off')
plt.show()
# 타깃값 확인
print([train_target[i] for i in range(10)])
#출력 [9, 0, 0, 3, 0, 2, 7, 2, 5, 5]
훈련 데이터중 10개의 이미지를 회색조로 시각화한다.

#데이터 1차원 배열로 수정
train_scaled = train_input / 255.0
train_scaled = train_scaled.reshape(-1, 28*28) #배열 -1만큼 축소,
print(train_scaled.shape)
#출력 (60000, 784) 784픽셀로 이루러진 각 샘플이 총 60000개
신경망을 구축할 때, 밀집층(완전 연결층)을 사용하며, 활성화 함수로 softmax를 적용하여 각 클래스에 대한 확률을 출력한다.
# 인공 신경망으로 모델 만들기
from tensorflow import keras
from sklearn.model_selection import train_test_split
train_scaled, val_scaled, train_target, val_target = train_test_split(train_scaled, train_target, test_size=0.2, random_state=42)
print(train_scaled.shape, train_target.shape)
#출력 (48000, 784) (48000,)
print(val_scaled.shape, val_target.shape)
#출력 (12000, 784) (12000,)
dense = keras.layers.Dense(10, activation='softmax', input_shape=(784,)) #뉴런 개수, 뉴런의 출력에 적용할 함수, 입력의 크기
# 신경망 모델 생성
model = keras.Sequential(dense)
# 훈련전 설정
model.compile(loss='sparse_categorical_crossentropy', metrics='accuracy')
print(train_target[:10])
#출력 [7 3 5 8 6 9 3 3 9 9] 모두 정수
손실 함수로 sparse_categoriacal_crossentropy를 사용한다. 이는 다중 분류 문제에서 타깃이 정수로 표현된 경우에 적합하다. 정확도(accuracy)를 측정 지표로 사용한다.
신경망에서 분류 문제를 해결하는 방식은 주로 이진 분류와 다중 분류로 나뉜다. 패션MNIST데이터셋 10개의 클래스가 있으므로 다중 분류에 해당하지만, 먼저 이진 분류와 다중 분류의 차이와 각각의 손실 함수에 대해 알아본다.
모델을 5 에포크 동안 훈련한다. 훈련 과정에서 손실과 정확도를 출력하며, 훈련된 모델을 통해 성능을 평가한다.
# 모델 훈련
model.fit(train_scaled, train_target, epochs=5)
# 출력
Epoch 1/5
1500/1500 [==============================] - 3s 2ms/step - loss: 0.5995 - accuracy: 0.7997
Epoch 2/5
1500/1500 [==============================] - 3s 2ms/step - loss: 0.4744 - accuracy: 0.8390
Epoch 3/5
1500/1500 [==============================] - 4s 3ms/step - loss: 0.4495 - accuracy: 0.8472
Epoch 4/5
1500/1500 [==============================] - 3s 2ms/step - loss: 0.4382 - accuracy: 0.8518
Epoch 5/5
1500/1500 [==============================] - 3s 2ms/step - loss: 0.4293 - accuracy: 0.8555
375/375 [==============================] - 1s 2ms/step - loss: 0.4433 - accuracy: 0.8481
# 성능 평가
model.evaluate(val_scaled, val_target)
# [0.443263441324234, 0.8480833172798157]