Create a classifier for the Fashion MNIST dataset
Note that the test will expect it to classify 10 classes and that
the input shape should be the native size of the Fashion MNIST dataset which is 28x28 monochrome.
Do not resize the data. Your input layer should accept
(28,28) as the input shape only.
If you amend this, the tests will fail.
Fashion MNIST ๋ฐ์ดํฐ ์ ์ ๋ํ ๋ถ๋ฅ๊ธฐ ์์ฑ ํ ์คํธ๋ 10 ๊ฐ์ ํด๋์ค๋ฅผ ๋ถ๋ฅ ํ ๊ฒ์ผ๋ก ์์ํ๊ณ ์ ๋ ฅ ๋ชจ์์ Fashion MNIST ๋ฐ์ดํฐ ์ธํธ์ ๊ธฐ๋ณธ ํฌ๊ธฐ ์ฌ์ผํฉ๋๋ค.28x28 ๋จ์.
๋ฐ์ดํฐ ํฌ๊ธฐ๋ฅผ ์กฐ์ ํ์ง ๋ง์ญ์์ค. input_shape๋ (28,28)์ ์ ๋ ฅ ๋ชจ์์ผ๋ก ๋ง ์ฌ์ฉํฉ๋๋ค.
ํ์ํ ๋ชจ๋์ import ํฉ๋๋ค.
import numpy as np
import matplotlib.pyplot as plt
import tensorflow as tf
from tensorflow.keras.layers import Dense, Flatten
from tensorflow.keras.models import Sequential
from tensorflow.keras.callbacks import ModelCheckpoint
tf.keras.datasets ์๋ ๋ค์ํ ์ํ ๋ฐ์ดํฐ๋ฅผ ์ ๊ณตํด์ค๋๋ค.
fashion_mnist = tf.keras.datasets.fashion_mnist
(x_train, y_train), (x_valid, y_valid) = fashion_mnist.load_data()
x_train.shape, x_valid.shape
y_train.shape, y_valid.shape
์ ๊ทํ(Normalization) ์ ์ ์ต์๊ฐ(min), ์ต๋๊ฐ(max)์ ํ์ธํฉ๋๋ค.
x_train.min(), x_train.max()
์ ๊ทํ(Normalization) ํฉ๋๋ค.
x_train = x_train / 255.0
x_valid = x_valid / 255.0
์ ๊ทํ ํ ์ต์๊ฐ/์ต๋๊ฐ ํ์ธ
x_train.min(), x_train.max()
# ์๊ฐํ
fig, axes = plt.subplots(2, 5)
fig.set_size_inches(10, 5)
for i in range(10):
axes[i//5, i%5].imshow(x_train[i], cmap='gray')
axes[i//5, i%5].set_title(str(y_train[i]), fontsize=15)
plt.setp( axes[i//5, i%5].get_xticklabels(), visible=False)
plt.setp( axes[i//5, i%5].get_yticklabels(), visible=False)
axes[i//5, i%5].axis('off')
plt.tight_layout()
plt.show()
- 0: ํฐ์ ์ธ /ํ
- 1: ๋ฐ์ง
- 2: ํ์ค๋ฒ(์ค์จํฐ์ ์ผ์ข )
- 3: ๋๋ ์ค
- 4: ์ฝํธ
- 5: ์๋ค
- 6: ์ ์ธ
- 7: ์ค๋์ปค์ฆ
- 8: ๊ฐ๋ฐฉ
- 9: ์ตํด ๋ถ์ธ
from IPython.display import Image
import numpy as np
import matplotlib.pyplot as plt
model = Sequential([
# Flatten์ผ๋ก shape ํผ์น๊ธฐ
Flatten(input_shape=(28, 28)),
# Dense Layer
Dense(1024, activation='relu'),
Dense(512, activation='relu'),
Dense(256, activation='relu'),
Dense(128, activation='relu'),
Dense(64, activation='relu'),
# Classification์ ์ํ Softmax
Dense(10, activation='softmax'),
])
optimizer
๋ ๊ฐ์ฅ ์ต์ ํ๊ฐ ์๋๋ ์๊ณ ๋ฆฌ์ฆ์ธ 'adam'์ ์ฌ์ฉํฉ๋๋ค.loss
์ค์ sigmoid
์ธ ๊ฒฝ์ฐ: binary_crossentropy
softmax
์ธ ๊ฒฝ์ฐ: categorical_crossentropy
sparse_categorical_crossentropy
)metrics
๋ฅผ 'acc' ํน์ 'accuracy'๋ก ์ง์ ํ๋ฉด, ํ์ต์ ์ ํ๋๋ฅผ ๋ชจ๋ํฐ๋ง ํ ์ ์์ต๋๋ค.model.compile(optimizer='adam', loss='sparse_categorical_crossentropy', metrics=['acc'])
val_loss
๊ธฐ์ค์ผ๋ก epoch ๋ง๋ค ์ต์ ์ ๋ชจ๋ธ์ ์ ์ฅํ๊ธฐ ์ํ์ฌ, ModelCheckpoint๋ฅผ ๋ง๋ญ๋๋ค.
checkpoint_path
๋ ๋ชจ๋ธ์ด ์ ์ฅ๋ ํ์ผ ๋ช
์ ์ค์ ํฉ๋๋ค.ModelCheckpoint
์ ์ ์ธํ๊ณ , ์ ์ ํ ์ต์
๊ฐ์ ์ง์ ํฉ๋๋ค.checkpoint_path = "my_checkpoint.ckpt"
checkpoint = ModelCheckpoint(filepath=checkpoint_path,
save_weights_only=True,
save_best_only=True,
monitor='val_loss',
verbose=1)
validation_data
๋ฅผ ๋ฐ๋์ ์ง์ ํฉ๋๋ค.epochs
์ ์ ์ ํ๊ฒ ์ง์ ํฉ๋๋ค.callbacks
์ ๋ฐ๋ก ์์์ ๋ง๋ checkpoint๋ฅผ ์ง์ ํฉ๋๋ค.history = model.fit(x_train, y_train,
validation_data=(x_valid, y_valid),
epochs=20,
callbacks=[checkpoint],
)
ํ์ต์ด ์๋ฃ๋ ํ์๋ ๋ฐ๋์ load_weights
๋ฅผ ํด์ฃผ์ด์ผ ํฉ๋๋ค.
๊ทธ๋ ์ง ์์ผ๋ฉด, ์ด์ฌํ ModelCheckpoint๋ฅผ ๋ง๋ ์๋ฏธ๊ฐ ์์ต๋๋ค.
# checkpoint ๋ฅผ ์ ์ฅํ ํ์ผ๋ช
์ ์
๋ ฅํฉ๋๋ค.
model.load_weights(checkpoint_path)
model.evaluate(x_valid, y_valid)