패션(의류) 이미지를 10개로 분류하는 딥러닝에 대한 데이터셋이 있다.
참고: https://github.com/zalandoresearch/fashion-mnist#labels
GitHub - zalandoresearch/fashion-mnist: A MNIST-like fashion product database. Benchmark
A MNIST-like fashion product database. Benchmark :point_down: - GitHub - zalandoresearch/fashion-mnist: A MNIST-like fashion product database. Benchmark
github.com
Fashion MNIST 데이터는 tf.keras datasets API에 들어있다.
mnist = tf.keras.datasets.fashion_mnist
# tf.keras.datasets에는 fashion_mnist 말고도 여러 데이터셋이 존재한다.
이 데이터는 load_data 함수로 튜플 두개를 사용하여 불러올수있다,
(training_images, training_labels),(test_images, test_labels) = mnist.load_data()
# 첫번째 튜플은 학습 데이터 X,y, 두번째 튜플은 검증 데이터 X,y로 받는다.
데이터의 형태를 확인해보자.
in:
training_images.shape
out:
(60000, 28, 28)
# 행 28, 열 28의 사진이 6만장 있다는것을 뜻한다.
실제로 plt.imshow를 사용하여 사진을 확인할수있다.
in:
import matplotlib.pyplot as plt
plt.imshow(training_images[100], cmap='gray')
out:
# training_images에서 100번째 사진이다.
training_labels[100]
8
# 위 링크에서 제공하는 레이블 표를 보면 bag으로 나온다.
이미지는 0부터 255까지의 숫자 데이터로 이루어져 있기에 따로 스케일링 라이브러리를 사용하지않고 간단히 255로 나누어 스케일링한다.
training_images = training_images/255.0
test_images = test_images/255.0
이미지와 같은 2차원 혹은 3차원 데이터를 모델링을 위해 1차원으로 만들어 주는 작업을 flatten이라고 한다.
# 학습데이터를 reshape(60000,28*28) 한것과 같은 결과가 나온다.
10개의 패션 이미지로 분류하기에 아웃풋 레이어를 10개의 노드로 구성한다.
여러개의 노드 중 하나의 값만 받기 위해서 softmax 엑티베이션을 사용한다.
flatten 작업과 softmax 에 유의하며 모델링해보자.
model = tf.keras.Sequential()
model.add(tf.keras.layers.Flatten())
model.add(tf.keras.layers.Dense(128,'relu'))
model.add(tf.keras.layers.Dense(10,'softmax'))
# 히든 레이어를 만들기 전 flatten 작업을 한다.
# flatten 하면 input_shape을 설정하지 않아도 된다.
# Softmax로 여러개의 값 중에서 가장 큰 값을 1로 만들고 나머지는 0으로 만들어준다.
이제 옵티마이저와 로스 함수를 컴파일 한다.
3가지 이상의 분류작업을 할때는 sparse_categorical_crossentropy(레이블 인코딩 사용시)를 사용한다.
model.compile('adam',loss= 'sparse_categorical_crossentropy', metrics= ['accuracy'])
# 2개 분류의 문제일때는 binary_crossentrophy 사용
# 3개 이상이며 y값이 레이블 인코딩으로 되어있는 경우 sparse_categorical_crossentropy 사용
# 3개 이상이며 y값이 원핫 인코딩일 경우 categorical_crossentropy 사용
학습시킨다.
in:
model.fit(training_images,training_labels, epochs= 5)
out:
Epoch 1/5
1875/1875 [==============================] - 7s 2ms/step - loss: 0.4969 - accuracy: 0.8256
Epoch 2/5
1875/1875 [==============================] - 4s 2ms/step - loss: 0.3747 - accuracy: 0.8639
Epoch 3/5
1875/1875 [==============================] - 4s 2ms/step - loss: 0.3369 - accuracy: 0.8762
Epoch 4/5
1875/1875 [==============================] - 4s 2ms/step - loss: 0.3128 - accuracy: 0.8856
Epoch 5/5
1875/1875 [==============================] - 5s 2ms/step - loss: 0.2949 - accuracy: 0.8903
<keras.callbacks.History at 0x7f33c06a38d0>
model.evaluate(test_images,test_labels)
out:
313/313 [==============================] - 1s 2ms/step - loss: 0.3589 - accuracy: 0.8723
[0.3588660657405853, 0.8723000288009644]
# 정확도가 87%정도 나온다.
컨퓨젼매트릭스로 어느 부분에서 컴퓨터가 많이 헷갈려 하는지 확인할수있다.
먼저 검증데이터로 구분(예측)하자.
in:
from sklearn.metrics import confusion_matrix
y_pred = model.predict(test_images)
y_pred
out:
array([[2.5591323e-06, 2.9317185e-08, 1.0955163e-07, ..., 4.2807236e-02,
4.2898642e-05, 9.5348150e-01],
[2.6612497e-05, 3.5216853e-12, 9.9871182e-01, ..., 8.2501296e-13,
3.0004610e-09, 3.5804459e-13],
[4.7480958e-07, 9.9999940e-01, 9.0232186e-09, ..., 2.6934517e-18,
5.5984075e-11, 5.9372619e-14],
...,
[1.1473469e-04, 4.0671253e-09, 1.2344043e-04, ..., 7.6533901e-08,
9.9878412e-01, 3.4618169e-10],
[9.6261215e-07, 9.9972016e-01, 3.0809815e-08, ..., 2.3222624e-10,
9.6264749e-08, 2.3915755e-08],
[6.5775188e-05, 1.0420579e-06, 1.5347554e-04, ..., 5.2082170e-02,
3.5964337e-03, 2.0248072e-04]], dtype=float32)
# 예상했던 0에서 9까지의 수가 나오지 않는데 이는 소프트맥스 엑티베이션 연산 결과이다.
# 0에서 9까지에서 해당 사진일 확률을 구한 값이다.
이제 이 값을 argmax 함수를 사용하여 실제값으로 변환해주자.
in:
y_pred = y_pred.argmax(axis=1)
out:
array([9, 2, 1, ..., 8, 1, 5])
# 해당 사진의 y값들에서 가장 큰값의 인덱스를 표시했다.
이제 컨퓨젼 매트릭스를 만들고 이를 시각화하자.
in:
from sklearn.metrics import confusion_matrix
cm = confusion_matrix(test_labels,y_pred)
sb.heatmap(cm,annot= True, fmt= '.0f' ,cmap='RdPu')
out:
# 셔츠인 6번과 0번인 티셔츠, 2번인 스웨터를 헷갈려한다.
'딥러닝' 카테고리의 다른 글
[딥러닝] MNIST 손글씨 숫자 실습, 원핫인코딩: to_categorical, categorical_crossentropy (0) | 2022.06.14 |
---|---|
[딥러닝] 딥러닝 모델 저장하고 불러오기 (0) | 2022.06.14 |
[딥러닝] Overfitting: EarlyStopping, Dropout 설정 (0) | 2022.06.13 |
[딥러닝] Validation 설정: validation_split, validation_data (0) | 2022.06.13 |
[딥러닝] 옵티마이저의 learning rate 설정 (0) | 2022.06.13 |
댓글