--20.신경망 모델훈련.ipynb--
"""
● 사이킷런의 머신러닝 알고리즘 :
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import os
import tensorflow as tf
from tensorflow import keras
tf.keras.utils.set_random_seed(42)
tf.config.experimental.enable_op_determinism()
base_path = r'/content/drive/MyDrive/dataset'
(train_input, train_target), (test_input,test_target) = keras.datasets.fashion_mnist.load_data()
train_scaled = train_input / 255.0
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)
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) # 앞의 hidden layer 뒤에 하나의 층 추가하기
model.add(keras.layers.Dense(10, activation='softmax'))
return model
model = model_fn()
model.summary()
model.compile(loss='sparse_categorical_crossentropy', metrics='accuracy')
history = model.fit(train_scaled, train_target, epochs=5, verbose=0)
type(history.history) # 훈련 측정값이 담겨있는 history dict 가 있다.
history.history.keys()
history.history['loss']
history.history['accuracy']
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()
model = model_fn()
model.compile(loss='sparse_categorical_crossentropy', metrics='accuracy')
history = model.fit(train_scaled, train_target, epochs=20, verbose=0)
history.history['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()

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()
plt.plot(history.history['loss'])
plt.plot(history.history['val_loss'])
plt.xlabel('epoch')
plt.ylabel('loss')
plt.legend(['train', 'val'])
plt.show()
"""
↑ 초기에는 검증손실이 감소하는듯 하나 다섯번째 에포크 즈음부터 다시 '상승'하기 시작
=> 과대적합 (overfit) 모델이 만들어지기 시작하는거다.
검증손실이 '상승'하는 시점을 가능한 뒤로 늦추 수 있으면 그리 해야 높은 모델 성능을 기대할 수 있다.
"""
None
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()
"""
↑ validation loss 가 많이 억제되고 있는게 보인다. 대체로 10번째 에포크까지는 전반적인 감소 추세인듯하다.
※ 그 밖에도 learning_rate=, momentum= 값들을 여러가지로 조정해보며 도전해보자
"""
None
신경망에서 사용되는 대표적인 규제 (regularization)
model.summary()
model = model_fn(keras.layers.Dropout(rate=0.3)) # 30% 정도 드롭아웃
model.summary()
"""
Dropout
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()
"""
↑ 과대적합은 확실히 많이 억제되고 있다.
열번쨰 에포크에서 검증손실의 감소 정도는 거의 멈췄다.. 크게 치솟지 않고 어느정도 유지.
이 모델은 20번의 에포크를 거치면서 결국 과대적합된 모델이 되었다.
과대적합 되지 않은 모델을 얻기 위해선 에포크 횟수를 10으로 하여 다시 훈련해야한다...
"""
None
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))
model.save_weights(os.path.join(base_path, 'model-weights.h5'))
model.save(os.path.join(base_path, 'model-whole.h5'))
model = None
model = model_fn(keras.layers.Dropout(0.3))
model.load_weights(os.path.join(base_path,'model-weights.h5'))
model.predict(val_scaled).shape
model.predict(val_scaled)[0]
val_labels = np.argmax(model.predict(val_scaled), axis=-1)
val_labels.shape
val_labels
np.mean(val_labels == val_target)
model = None
model = keras.models.load_model(os.path.join(base_path, 'model-whole.h5'))
model.summary()
model.evaluate(val_scaled, val_target)
keras.callbacks
"""
콜백(callback) 은 '훈련 과정 중간' 에 어떤 작업을 수행할 수 있게 하는 객체
fit() 의 callbacks= 매개변수로 전달하여 사용 (list)
"""
None
에포크마다 모델을 저장
model = model_fn(keras.layers.Dropout(0.3))
model.compile(optimizer='adam', loss='sparse_categorical_crossentropy', metrics='accuracy')
checkpoint_cb = keras.callbacks.ModelCheckpoint(os.path.join(base_path, 'best-model.h5'),
save_best_only=True)
history = model.fit(train_scaled, train_target, epochs=20, verbose=0,
validation_data=(val_scaled, val_target),
callbacks=[checkpoint_cb])
model = None
model = keras.models.load_model(os.path.join(base_path, 'best-model.h5'))
model.evaluate(val_scaled, val_target)
model = model_fn(keras.layers.Dropout(0.3))
model.compile(optimizer='adam', loss='sparse_categorical_crossentropy', metrics='accuracy')
checkpoint_cb = keras.callbacks.ModelCheckpoint(os.path.join(base_path, 'best-model.h5'),
save_best_only=True)
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])
early_stopping_cb.stopped_epoch
"""
9
epoch 횟수는 0부터 시작. 9는 10번째 에포크에서 훈련 중지되었다.
patience = 2 를 지정 최상의 모델은 8번째 에포크 (7) 일거다
"""
None
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)