https://www.tensorflow.org/datasets/catalog/fashion_mnist?hl=ko
import numpy as np
import tensorflow as tf
from tensorflow.keras.datasets import fashion_mnist #fashion_mnist ์ฌ์ฉ
(X_train, y_train), (X_test, y_test) = fashion_mnist.load_data()
์ฌ์ง ๊ฐ์ ธ์ค๊ธฐ
X_train.shape
(60000, 28, 28)
- ์ฌ์ง 60000๊ฐ 28ํ 28์ด์ด๋ค.
<์ฒซ ๋ฒ์งธ ์ฌ์ง ๊ฐ์ ธ์ค๊ธฐ>
X_train[0 , : , : ] # 3์ฐจ์์ด๋ฏ๋ก ์ฝค๋ง๊ฐ 2๊ฐ์ด๋ค
ndarray (28, 28) show data
y_train[0]
9
- ์ฒซ ๋ฒ์งธ ์ฌ์ง์ ์ ๋ต. fashion mnist์ label=9๋ Ankel boots์ด๋ค.
<๋ ๋ฒ์งธ ์ฌ์ง ๊ฐ์ ธ์ค๊ธฐ>
X_train[1 , : , : ]
ndarray (28, 28) show data
y_train[1]
0
- ๋ ๋ฒ์งธ ์ฌ์ง์ ์ ๋ต. fashion mnist์ label=0๋ T-shirt/top์ด๋ค.
ํผ์ฒ์ค์ผ์ผ๋ง
์ด๋ฏธ์ง๋ ๋ฒ์๊ฐ 0~255๊น์ง ์ด๊ธฐ๋๋ฌธ์, ํผ์ฒ์ค์ผ์ผ๋ง์ /255๋ฅผ ํ๋ฉด ๋๋ค
ํผ์ฒ์ค์ผ์ผ๋งํ๋ฉด 0๊ณผ 1 ์ฌ์ด์ ๊ฐ์ผ๋ก ๋ํ๋ผ ์ ์๋ค
X_train = X_train/255.0 #(255๋ก ๋๋๋ฉด int, 255.0์ผ๋ก ๋๋๋ฉด float์ผ๋ก ๋๋๊ฒ ๋ค๋ ์๋ฏธ์ด๋ค)
X_test = X_test/255.0
๋ฐ์ดํฐ์ ์ reshapeํ๊ธฐ
X_train.shape
(60000, 28, 28)
- ์ฌ์ง 60000๊ฐ 28ํ 28์ด์ด๋ค.
๋ฐ์ดํฐ๋ฅผ reshape ํด์ผ ํ๋ ์ด์ ๋?
๋ฅ๋ฌ๋์ ์๋์ ๊ฐ์ ๊ณผ์ ์ผ๋ก ์ดํ๋๋๋ฐ, X_train์ ๋ฐ์ดํฐ๋ ์ฌ์ง์ผ๋ก, ๋ค๋ชจ๋ ํํ๋ฅผ ๊ฐ์ง๊ณ ์๋ค.
๋ค๋ชจ๋ ํํ์ ์ฌ๋ฌ ํฝ์ ๋ค์ ๋ฅ๋ฌ๋ํ์ฌ ๊ฒ์ ์์0, ํฐ์์1๋ก ํ์ฌ ์ธ๊ณต์ง๋ฅ์ด ์ ๋ต์ ์ฐพ์๊ฐ๋ ํ์ต๊ณผ์ ์ ๋ฐ๋ฅด๊ธฐ์,
๋ฅ๋ฌ๋์ ๊ณผ์ ์ ๊ฑฐ์น๋ ค๋ฉด flattening์ ํตํด ํ๋์ ์ด๋ก ๋ง๋ค์ด์ค์ผ ํ๋ค.
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Dense, Flatten
def build_model():
model = Sequential()
model.add( Flatten() ) # ์
๋ ฅ ๋ ์ด์ด Flatten์ผ๋ก, 784๊ฐ๋ก ์ค์ ๋๋ค (28์ด*28ํ)
model.add( Dense(128, 'relu') ) # ํ๋ ๋ ์ด์ด๋ 128๊ฐ๋ก ์ค์ ํ์๋ค. ์ค์ ํ๋ ์ฌ๋ ๋ง์๋๋ก ์ค์ ํ๋ฉด ๋๋ค
model.add( Dense(10, 'softmax')) # ๋ ์ด๋ธ์ด 10๊ฐ(0~9๊น์ง)์ด๋ฏ๋ก, ์ถ๋ ฅ๋ ์ด์ด๋ 10๊ฐ๋ก ์ค์ ํ๋ค
model.compile('adam', loss='sparse_categorical_crossentropy', metrics=['accuracy'])
return model
# 3๊ฐ ์ด์์ ๋ถ๋ฅ๋ฌธ์ ๋ loss function์ sparse_categorical_crossentropy๋ก ํ๋ค
๋ฅ๋ฌ๋์ ์ถ๋ ฅ๊ฐ์ ๋ค ๋ํด์ 1์ด ๋์ด์ผ ํ๊ณ , ํ๋ฅ ๋ก ๊ฒฐ๊ณผ๊ฐ ๋ํ๋๋ค 'softmax'๋ผ๋ ์กํฐ๋ฒ ์ด์ ํ์ ์ ์ด์ฉํ๋ฉด ์ฌ๋ฌ๊ฐ์ ์ถ๋ ฅ๊ฐ์ ํฉ์ด 1๋ก ๋ํ๋๋ค
model = build_model()
from tensorflow.keras.callbacks import EarlyStopping
early_stopping = EarlyStopping(patience=10)
model = build_model()
epoch_history = model.fit(X_train, y_train, epochs= 1000, validation_split=0.2, callbacks=[early_stopping])
์คํ์ํค๋ฉด loss, accuracy, val_loss, val_accuracy์ด ์ํฌํฌ๋ง๋ค ์ถ๋ ฅ๋๋ค.
์ผ๋ฆฌ์คํ์ ๊ดํ ๋ด์ฉ์ ์๋ ๊ธ์ ์ฐธ์กฐํ๋ค
https://codebunny99.tistory.com/31
๊ฒฐ๊ณผ ์ถ๋ ฅํ๊ธฐ
model.evaluate(X_test,y_test)
[==============================] - 1s 2ms/step - loss: 0.3772 - accuracy: 0.8818
[0.3771723508834839, 0.8817999958992004]
# loss์ val_loss ๊ทธ๋ํ๋ก ๋ณด๊ธฐ
plt.plot(epoch_history.history['loss'])
plt.plot(epoch_history.history['val_loss'])
plt.legend(['loss','val_loss'])
plt.show()
- ๊ณผ๊ฑฐ์ ๋ํ ํ์ต๋ฐ์ดํฐ์ธ loss๋ ๊ณผ๊ฑฐ๋ฐ์ดํฐ๋ฅผ ํ์ตํ ๋๋ง๋ค ๊ณผ๊ฑฐ๋ฐ์ดํฐ์ ๋ํ ์ค์ฐจ๊ฐ ๊ฐ์ํ์ง๋ง,
val_loss, ์ฆ ๋ฏธ๋์ ๋ค์ด์ฌ ๋ฐ์ดํฐ์ ๋ํ ์ค์ฐจ๋ ๋์ด๋๊ธฐ๋ ์ค์ด๋ค๊ธฐ๋ ํ๋ค๋ ๊ฒ์ ๋ณผ ์ ์๋ค.
๊ทธ๋ฌ๋ ๋์ฒด๋ก loss๋ ์ค์ด๋๋ ํ์์ ๋ณด์ธ๋ค.
# accuracy์ val_accuracy ๊ทธ๋ํ๋ก ๋ณด๊ธฐ
plt.plot(epoch_history.history['accuracy'])
plt.plot(epoch_history.history['val_accuracy'])
plt.legend(['accuracy','val_accuracy'])
plt.show()
- ๊ณผ๊ฑฐ๋ฐ์ดํฐ์ ๋ํ ์ ํ๋๋ ๊ณผ๊ฑฐ๋ฐ์ดํฐ๊ฐ ํ์ต๋ ์๋ก ๋์ด๋์ง๋ง, ๋ฏธ๋์ ๋ํ ์์ธก์ ๋ํ ์ ํ๋๋ ์๋ก์ด๋ฐ์ดํฐ์ ๋ํ ์์ธก์ด๋ฏ๋ก ์ ํํด์ง๊ธฐ๋, ๋ถ์ ํํด์ง๊ธฐ๋ ํ์ง๋ง ๋์ฒด๋ก ์ฌ๋ผ๊ฐ๋ ํ์์ ๋ณด์ธ๋ค๋ ๊ฒ์ ์ ์ ์๋ค.
confusion matrix
import seaborn as sb
from sklearn.metrics import confusion_matrix
y_pred = np.argmax(model.predict(X_test), axis=1)
# argmax๋ ์ฃผ์ด์ง ๋ฐฐ์ด์์ ์ต๋๊ฐ์ ๊ฐ์ง ์์์ ์ธ๋ฑ์ค๋ฅผ ๋ฐํํ๋ ํจ์์ด๋ค.
# argmax๋ฅผ ์ฐ๋ ์ด์ ๋, ์ถ๋ ฅ๊ฐ 10๊ฐ ์ค์์ ๊ฐ์ฅ ๋์ ํ๋ฅ ์ ๊ฐ์ ธ์ค๋ max๊ฐ์ ์ธ๋ฑ์ค๋ฒํธ(์ฆ, ๋ผ๋ฒจ ๋ฒํธ)๊ฐ ์ ๋ต์ธ y_test์ ์ผ์นํ๋์ง๋ฅผ ์์์ผ ํ๊ธฐ ๋๋ฌธ์ด๋ค.
cm = confusion_matrix(y_test, y_pred)
cm
[==============================] - 1s 3ms/step
array([[783, 3, 26, 27, 3, 0, 150, 0, 8, 0],
[ 1, 972, 1, 19, 5, 0, 2, 0, 0, 0],
[ 12, 1, 810, 12, 124, 0, 41, 0, 0, 0],
[ 15, 5, 10, 904, 29, 0, 31, 0, 5, 1],
[ 0, 0, 94, 33, 845, 0, 26, 0, 2, 0],
[ 0, 0, 0, 1, 0, 946, 0, 23, 3, 27],
[ 75, 0, 113, 31, 100, 0, 674, 0, 7, 0],
[ 0, 0, 0, 0, 0, 11, 0, 974, 1, 14],
[ 5, 0, 10, 4, 5, 2, 11, 4, 959, 0],
[ 0, 0, 0, 0, 0, 5, 1, 43, 0, 951]])
np.diagonal(cm).sum() / cm.sum() # ์ ํ๋ = ๋๊ฐ์ ์ ๊ฐ์ ํฉ / ์ ์ฒด ํฉ
0.8818