[인공지능] 케라스 기초 - 콜백

참조


콜백

  • fit() 함수의 callbacks 매개변수를 사용하여 케라스가 훈련의 시작이나 끝에 호출할 객체 리스트를 지정할 수 있음
  • 여러 개 사용 가능
  • ModelCheckpoint
    • tf.keras.callbacks.ModelCheckpoint
    • 정기적으로 모델의 체크포인트를 저장하고, 문제가 발생할 떄 복구하는데 사용
  • EarlyStopping
    • tf.keras.callbacks.EarlyStopping
    • 검증 성능이 한동안 개선되지 않을 경우 학습을 중단할 때 사용
  • LearningRateScheduler
    • tf.keras.callbacks.LearningRateScheduler
    • 최적화를 하는 동안 학습률(learning_rate)를 동적으로 변경할 때 사용
  • TensorBoard
    • tf.keras.callbacks.TensorBoard
    • 모델의 경과를 모니터링할 때 사용
from matplotlib.pyplot import annotate, axis
import tensorflow as tf
from tensorflow.keras.datasets.mnist import load_data
from tensorflow.keras.models import Sequential
from tensorflow.keras import models
from tensorflow.keras.layers import Dense, Input, Flatten
from tensorflow.keras.utils import to_categorical
from sklearn.model_selection import train_test_split
import numpy as np
import matplotlib.pylab as plt

plt.style.use('seaborn-white')

# 데이터셋 로드

(x_train_full, y_train_full), (x_test, y_test) = load_data(path='mnist.npz')

x_train, x_val, y_train, y_val = train_test_split(x_train_full, y_train_full,
                                                  test_size = 0.3,
                                                  random_state = 111)

# 데이터 확인

print("학습 데이터 : {}\t레이블 : {}".format(x_train_full.shape, y_train_full.shape))
print("학습 데이터 : {}\t레이블 : {}".format(x_train.shape, y_train.shape))
print("검증 데이터 : {}\t레이블 : {}".format(x_val.shape, y_val.shape))
print("테스트 데이터 : {}\t레이블 : {}".format(x_test.shape, y_test.shape))

# 데이터 전처리
x_train = x_train / 255. 
x_val = x_val / 255.
x_test = x_test / 255.

y_train = to_categorical(y_train)
y_val = to_categorical(y_val)
y_test = to_categorical(y_test)

# 모델 구성(Sequential)
def build_model():
    model = Sequential([Input(shape=(28,28), name='input'),
                        Flatten(input_shape=[28,28], name='flatten'),
                        Dense(100, activation='relu', name='dense1'),
                        Dense(64, activation='relu', name='dense2'),
                        Dense(32, activation='relu', name='dense3'),
                        Dense(10, activation='softmax', name='output')])

    model.compile(loss='categorical_crossentropy',
                  optimizer='sgd',
                  metrics=['accuracy'])
    return model

model = build_model()
model.summary()
학습 데이터 : (60000, 28, 28)   레이블 : (60000,)
학습 데이터 : (42000, 28, 28)   레이블 : (42000,)
검증 데이터 : (18000, 28, 28)   레이블 : (18000,)
테스트 데이터 : (10000, 28, 28) 레이블 : (10000,)

Model: "sequential"
_________________________________________________________________
 Layer (type)                Output Shape              Param #
=================================================================
 flatten (Flatten)           (None, 784)               0

 dense1 (Dense)              (None, 100)               78500

 dense2 (Dense)              (None, 64)                6464

 dense3 (Dense)              (None, 32)                2080

 output (Dense)              (None, 10)                330

=================================================================
Total params: 87,374
Trainable params: 87,374
Non-trainable params: 0

ModelCheckpoint

  • 최상의 모델만을 저장
    • save_best_only=True
from tensorflow.keras.models import load_model
from tensorflow.keras.callbacks import ModelCheckPoint, EarlyStopping, LearningRateScheduler, TensorBoard

check_point_cb = ModelCheckPoint('keras_mninst_model.h5')
history = model.fit(x_train, y_train, epochs=10, callbacks=[check_point_cb])

history.history.keys()

loaded_model = load_model('keras_mnist_model.h5')
loaded_model.summary()

cp = ModelCheckpoint('keras_best_model.h5', save_best_only=True)

history = model.fit(x_train, y_train, epochs=10, validation_data=(x_val, y_val), callbacks=[cp])

history.history.keys()

loaded_model2 = load_model('keras_best_model.h5')
loaded_model2.summary()

EarlyStopping

  • 일정 에포크(patience) 동안 검증 세트에 대한 점수가 오르지 않으면 학습을 멈춤
  • 모델이 향상되지 않으면 학습이 자동으로 중지되므로, 에코드(epochs) 숫자를 크게 해도 무방
  • 학습이 끝난 후의 최상의 가중치를 복원하기 때문에 모델을 따로 복원할 필요없음
from tensorflow.keras.models import load_model
from tensorflow.keras.callbacks import ModelCheckpoint, EarlyStopping, LearningRateScheduler, TensorBoard

model = build_model()

cp = ModelCheckpoint('keras_best_model2.h5', save_best_only=True)
early_stopping_cb = EarlyStopping(patience=3, monitor='val_loss',
                                  restore_best_weights=True)

history = model.fit(x_train, y_train, epochs=50, 
                    validation_data=(x_val, y_val), callbacks=[cp, early_stopping_cb])

LearningRateScheduler

from tensorflow.keras.models import load_model
from tensorflow.keras.callbacks import ModelCheckpoint, EarlyStopping, LearningRateScheduler, TensorBoard

def scheduler(epoch, learning_rate):
    if epoch < 10:
        return learning_rate
    else:
        return learning_rate * tf.math.exp(-0.1)

model = build_model()

print(round(model.optimizer.lr.numpy(), 5))

lr_scheduler_cb = LearningRateScheduler(scheduler)

history = model.fit(x_train, y_train, epochs=15,
                    callbacks=[lr_scheduler_cb], verbose=0)

print(round(model.optimizer.lr.numpy(), 5))
0.01
0.00607

728x90

이 글을 공유하기

댓글

Designed by JB FACTORY