- ํธ๋ ์ด๋ ์ธํธ์ ๊ฒ์ฆ์ธํธ ๋๋๊ธฐ
from tensorflow import keras
from sklearn.model_selection import train_test_split
(train_input, train_target), (test_input, test_target) = keras.datasets.fashion_mnist.load_data()
train_scaled = train_input / 255.0
train_scaled, val_scaled, train_target, val_target = train_test_split(
train_scaled, train_target, test_size = 0.2, random_state=42
)
- ๋ชจ๋ธ์ ๋ง๋๋ ํจ์ ์์ฑ
def model_fn(a_layer=None):
model = keras.Sequential()
model.add(keras.layers.Flatten(input_shape=(28,28)))
model.add(keras.layers.Dense(100, activation = "relu"))
if a_layer:
model.add(a_layer)
model.add(keras.layers.Dense(10, activation="softmax"))
return model
model = model_fn()
model.summary()
Model: "sequential_1"
_________________________________________________________________
Layer (type) Output Shape Param #
=================================================================
flatten_1 (Flatten) (None, 784) 0
dense_1 (Dense) (None, 100) 78500
dense_2 (Dense) (None, 10) 1010
=================================================================
Total params: 79,510
Trainable params: 79,510
Non-trainable params: 0
_________________________________________________________________
model.compile(loss="sparse_categorical_crossentropy", metrics="accuracy")
history = model.fit(train_scaled, train_target, epochs=5, verbose=0)
history.history
{'loss': [0.5299330353736877,
0.3862016499042511,
0.35116592049598694,
0.3301049470901489,
0.3153148293495178],
'accuracy': [0.8133958578109741,
0.8612083196640015,
0.8732500076293945,
0.8815833330154419,
0.8871250152587891]}
์์ค ๊ณก์
import matplotlib.pyplot as plt
- ๊ฐ ์ํฌํฌ๋ง๋ค ์ธก์ ๋ loss ๊ฐ
plt.plot(history.history["loss"])
plt.xlabel('epoch')
plt.ylabel('loss')
plt.show()
- ๊ฐ ์ํฌํฌ๋ง๋ค ์ธก์ ๋ ์ ํ๋
plt.plot(history.history["accuracy"])
plt.xlabel('epoch')
plt.ylabel('accuracy')
plt.show()
- ์ํฌํฌ๊ฐ ๋์ด๋ ์๋ก loss ์ค๊ณ accuracy ๋์ด๋จ
- epoch๋ฅผ 20์ผ๋ก ์ฌ๋ ธ๋๋ ์์ค ์ ๊ฐ์
- ๊ณผ์ฐ ๋ ๋์ ๋ชจ๋ธ์ ํ๋ จํ ๊ฒ์ผ๊น?
model = model_fn()
model.compile(loss="sparse_categorical_crossentropy", metrics = "accuracy")
history = model.fit(train_scaled, train_target, epochs=20, verbose = 0)
plt.plot(history.history['loss'])
plt.xlabel('epoch')
plt.ylabel('loss')
plt.show()
๊ฒ์ฆ ์์ค
- ์ํฌํฌ์ ๋ํ ๊ณผ๋์ ํฉ๊ณผ ๊ณผ์์ ํฉ ํ์ ํ๋ ค๋ฉด ํ๋ จ์ธํธ์ ๋ํ ์ ์ ๋ฟ๋ง ์๋๋ผ ๊ฒ์ฆ ์ธํธ์ ๋ํ ์ ์๋ ํ์
- fit ๋ฉ์๋์ validation_data ๋งค๊ฐ๋ณ์ ์ถ๊ฐํ๋ฉด ๊ฒ์ฆ์ธํธ์ ๋ํ loss์ accuracy๋ ์ ์ ์์
model = model_fn()
model.compile(loss="sparse_categorical_crossentropy", metrics="accuracy")
history = model.fit(train_scaled, train_target, epochs=20, verbose=0, validation_data=(val_scaled, val_target))
history.history.keys()
dict_keys(['loss', 'accuracy', 'val_loss', 'val_accuracy'])
- ์ด๊ธฐ์ ๊ฒ์ฆ ์์ค์ด ๊ฐ์ํ๋ค๊ฐ ๋ค์ ์์นํ๊ธฐ ์์
- ํ๋ จ์์ค์ ๊พธ์คํ ๊ฐ์ํ๊ธฐ ๋๋ฌธ์ ์ ํ์ ์ธ ๊ณผ๋์ ํฉ ๋ชจ๋ธ์ด ๋ง๋ค์ด์ง
plt.plot(history.history["loss"])
plt.plot(history.history["val_loss"])
plt.xlabel('epoch')
plt.ylabel('loss')
plt.legend(['train','val'])
plt.show()
- optimizer ํ์ดํผํ๋ผ๋ฏธํฐ๋ฅผ ์กฐ์ ํ์ฌ ๊ณผ๋์ ํฉ ์ํ์ํฌ ์ ์๋๊ฐ
- Adam์ ์ ์์ ํ์ต๋ฅ ์ ์ฌ์ฉํ๊ธฐ ๋๋ฌธ์ ์ํฌํฌ๊ฐ ์งํ๋๋ฉด์ ํ์ต๋ฅ ์ ํฌ๊ธฐ ์กฐ์ ๊ฐ๋ฅ
- overfitting ์ด ํจ์ฌ ์ค์๋ค
- ์ฌ์ ํ ์๋์ด ๋จ์์๊ธด ํจ
- ์ด๋ Adam optimizer๊ฐ ์ด ๋ฐ์ดํฐ์ ์ ์ ๋ง๋๋ค๋ ๊ฒ์ ์๋ฏธ
model = model_fn()
model.compile(optimizer ="adam", loss="sparse_categorical_crossentropy", metrics="accuracy")
history = model.fit(train_scaled, train_target, epochs=20, verbose=0, validation_data=(val_scaled, val_target))
plt.plot(history.history["loss"])
plt.plot(history.history["val_loss"])
plt.xlabel('epoch')
plt.ylabel('loss')
plt.legend(['train','val'])
plt.show()
Dropout
- dropout : ํ๋ จ ๊ณผ์ ์์ ์ธต์ ์๋ ์ผ๋ถ ๋ด๋ฐ์ ๋๋คํ๊ฒ ๊บผ์ overfitting ๋ง์
- keras.layers ํจํค์ง ์๋ Dropout ํด๋์ค๋ก ์ ๊ณต
- ์ด๋ค ์ธต ๋ค์ ๋ฌ์ ์ด ์ธต์ ์ถ๋ ฅ์ ๋๋คํ๊ฒ 0์ผ๋ก ๋ง๋ฌ
- ์ธต์ฒ๋ผ ์ฌ์ฉ๋์ง๋ง ํ๋ จ๋๋ ๋ชจ๋ธ ํ๋ผ๋ฏธํฐ๋ X
- ์ผ๋ถ ๋ด๋ฐ์ ์ถ๋ ฅ์ 0์ผ๋ก ๋ง๋ค ๋ฟ ์ ์ฒด ์ถ๋ ฅ ๋ฐฐ์ด์ ํฌ๊ธฐ๋ฅผ ๋ฐ๊พธ์ง X
model = model_fn(keras.layers.Dropout(0.3))
model.summary()
Model: "sequential_6"
_________________________________________________________________
Layer (type) Output Shape Param #
=================================================================
flatten_6 (Flatten) (None, 784) 0
dense_11 (Dense) (None, 100) 78500
dropout (Dropout) (None, 100) 0
dense_12 (Dense) (None, 10) 1010
=================================================================
Total params: 79,510
Trainable params: 79,510
Non-trainable params: 0
_________________________________________________________________
- ํ์คํ ์ค์ด๋ overfitting
- ์ด ๋ฒ์งธ ์ํฌํฌ์์ ๊ฒ์ฆ ์์ค์ ๊ฐ์๊ฐ ๋ฉ์ถ์ง๋ง ํฌ๊ฒ ์์นํ์ง ์๊ณ ์ด๋ ์ ๋ ์ ์ง ์ค
model.compile(optimizer="adam", loss="sparse_categorical_crossentropy", metrics="accuracy")
history = model.fit(train_scaled, train_target, epochs=20, verbose=0, validation_data=(val_scaled, val_target))
plt.plot(history.history['loss'])
plt.plot(history.history['val_loss'])
plt.xlabel('epoch')
plt.ylabel('loss')
plt.legend(['train','val'])
plt.show()
๋ชจ๋ธ ์ ์ฅ๊ณผ ๋ณต์
- ์์ ์คํ ๊ฒฐ๊ณผ 10๋ฒ์ด ์ต์
- ์์ ๋ชจ๋ธ์ ์ํฌํฌ ํ์๋ฅผ 10์ผ๋ก ์ง์ ํ๊ณ ๋ค์ ๋ชจ๋ธ ํ๋ จํ๊ธฐ
model = model_fn(keras.layers.Dropout(0.3))
model.compile(optimizer="adam", loss="sparse_categorical_crossentropy", metrics="accuracy")
history = model.fit(train_scaled, train_target, epochs=10, verbose=0, validation_data=(val_scaled, val_target))
plt.plot(history.history['loss'])
plt.plot(history.history['val_loss'])
plt.xlabel('epoch')
plt.ylabel('loss')
plt.legend(['train','val'])
plt.show()
- save_weights : ํ๋ จ๋ ๋ชจ๋ธ์ ํ๋ผ๋ฏธํฐ ์ ์ฅ
model.save_weights("model-weights.h5")
- save : ๋ชจ๋ธ ๊ตฌ์กฐ์ ๋ชจ๋ธ ํ๋ผ๋ฏธํฐ ํจ๊ป ์ ์ฅ
model.save('model-whole.h5')
- ํ์ธ
๋ ๊ฐ์ง ์คํ
- ํ๋ จํ์ง ์์ ์๋ก์ด ๋ชจ๋ธ์ ๋ง๋ค๊ณ model-weights.h5 ์์ ํ๋ จ๋ ๋ชจ๋ธ ํ๋ผ๋ฏธํฐ ์ฝ์ด์ ์ฌ์ฉ
- ์์ model-whole.h5 ํ์ผ์์ ์๋ก์ด ๋ชจ๋ธ ๋ง๋ค์ด์ ๋ฐ๋ก ์ฌ์ฉ
์ฒซ๋ฒ์งธ ์คํ
- load_weights() -> ๋ชจ๋ธ ํ๋ผ๋ฏธํฐ ์ ์ฌํ๋ ๋ฉ์๋
- ์ด ๋ชจ๋ธ์ ๊ฒ์ฆ ์ ํ๋ ํ์ธ
- ์ผ๋ผ์ค์์์ predict ๋ฉ์๋ : ์ฌ์ดํท๋ฐ๊ณผ ๋ค๋ฅด๊ฒ 10๊ฐ ํด๋์ค์ ๋ํ ํ๋ฅ ๋ฐํ
- ์ค๋น๋ ๊ฒ์ฆ์ธํธ๋ 12000๊ฐ ์ด๋ฏ๋ก predict ๋ฉ์๋๋ (12000,10) ํฌ๊ธฐ์ ๋ฐฐ์ด ๋ฐํ
model = model_fn(keras.layers.Dropout(0.3))
model.load_weights('model-weights.h5')
import numpy as np
val_labels = np.argmax(model.predict(val_scaled), axis=-1)
np.mean(val_labels==val_target)
0.8781666666666667
๋๋ฒ์งธ ์คํ
model = keras.models.load_model('model-whole.h5')
model.evaluate(val_scaled, val_target)
375/375 [==============================] - 0s 833us/step - loss: 0.3325 - accuracy: 0.8782
[0.33252522349357605, 0.878166675567627]
๊ฒฐ๋ก
- ๊ฐ์ ๋ชจ๋ธ์ ์ ์ฅํ๊ณ ๋ค์ ๋ถ๋ฌ๋ค์๊ธฐ ๋๋ฌธ์ ๋์ผํ ์ ํ๋ ์ป์
- ๋ถํธํ ์
- 20๋ฒ์ ์ํฌํฌ ๋์ ๋ชจ๋ธ์ ํ๋ จํ์ฌ ๊ฒ์ฆ ์ ์๊ฐ ์์นํ๋ ์ง์ ํ์ธ
- ๋ชจ๋ธ ๊ณผ๋์ ํฉ๋์ง ์๋ ์ํฌํฌ๋งํผ ๋ค์ ํ๋ จ
- ๋ ๋ฒ์ฉ ํ๋ จํ์ง ์๋ ๋ฐฉ๋ฒ ์์๊น
์ฝ๋ฐฑ
- ์ฝ๋ฐฑ : ํ๋ จ๊ณผ์ ์ค๊ฐ์ ์ด๋ค ์์ ์ ์ํํ ์ ์๊ฒ ํ๋ ๊ฐ์ฒด
- ModelCheckpoint ์ฝ๋ฐฑ : ๊ธฐ๋ณธ์ ์ผ๋ก ์ต์์ ๊ฒ์ฆ ์ ์๋ฅผ ๋ง๋๋ ๋ชจ๋ธ์ ์ ์ฅ
- ํ์ง๋ง ์ฌ์ ํ 20๋ฒ์ ์ํฌํฌ๋์ ํ๋ จ์ ํจ
- ์ฌ์ค ๊ฒ์ฆ ์์ค ์ ์๊ฐ ์์นํ๊ธฐ ์์ํ๋ฉด overfitting์ด ์ปค์ง๊ธฐ ๋๋ฌธ์ ํ๋ จ ๊ณ์ํ ํ์ ์์
- overfitting์ด ์์๋๊ธฐ ์ ์ ํ๋ จ ๋ฏธ๋ฆฌ ์ข ๋ฃํ๋ ๊ฒ : Early stopping(์กฐ๊ธฐ ์ข ๋ฃ)
model = model_fn(keras.layers.Dropout(0.3))
model.compile(optimizer='adam', loss='sparse_categorical_crossentropy', metrics='accuracy')
checkpoint_cb = keras.callbacks.ModelCheckpoint('best-model.h5')
model.fit(
train_scaled, train_target, epochs=20, verbose=0,
validation_data=(val_scaled, val_target), callbacks=[checkpoint_cb]
)
model = keras.models.load_model('best-model.h5')
model.evaluate(val_scaled, val_target)
375/375 [==============================] - 0s 792us/step - loss: 0.3189 - accuracy: 0.8856
[0.3189184069633484, 0.8855833411216736]
Early Stopping
- ์กฐ๊ธฐ์ข ๋ฃ : ๊ณผ๋์ ํฉ์ด ์ปค์ง๊ธฐ ์ ์ ํ๋ จ์ ๋ฏธ๋ฆฌ ์ค์งํ๋ ๊ฒ
- patience : ์ง์ ๋ patience๋ฒ ์ฐ์ ๊ฒ์ฆ ์ ์๊ฐ ํฅ์๋์ง ์์ ๊ฒฝ์ฐ ํ๋ จ ์ข ๋ฃ
model = model_fn(keras.layers.Dropout(0.3))
model.compile(optimizer='adam', loss='sparse_categorical_crossentropy', metrics='accuracy')
checkpoint_cb = keras.callbacks.ModelCheckpoint('best-model.h5')
early_stopping_cb = keras.callbacks.EarlyStopping(patience=2, restore_best_weights=True)
history = model.fit(
train_scaled, train_target, epochs=20, verbose=0,
validation_data=(val_scaled, val_target), callbacks=[checkpoint_cb, early_stopping_cb]
)
11๋ฒ๋ง์ ์ข ๋ฃ
early_stopping_cb.stopped_epoch
11
plt.plot(history.history['loss'])
plt.plot(history.history['val_loss'])
plt.xlabel('epoch')
plt.ylabel('loss')
plt.legend(['train','val'])
plt.show()
model.evaluate(val_scaled, val_target)
375/375 [==============================] - 0s 791us/step - loss: 0.3259 - accuracy: 0.8845
[0.3258848488330841, 0.8845000267028809]