본문 바로가기

AIFFLE/STARTER

[DL] 5. 모델 저장과 콜백

728x90
과정 개요
MNIST 딥러닝 모델 예제 숫자 데이터를 분류하는 모델을 설계하고 학습시킵니다. 해당 모델은 오늘 배울 내용을 적용해볼 베이스라인이 될 것입니다.
모델 저장과 로드 학습시킨 모델의 가중치를 저장하고 불러오는 방법을 학습하고 직접 실습해봅니다.
콜백 (Callbacks) 학습에 관여하는 콜백 기능 중 대표적인 몇가지에 대해 알아보고 직접 실습해봅니다.

 

학습 목표
딥러닝 모델을 저장하고 복원하는 방법에 대해서 설명할 수 있습니다.모델 학습 시에 사용할 수 있는 콜백 함수에 대해 설명할 수 있습니다.
학습시킨 모델을 저장하고 관리하는 것은 모델 관리, 더 나아가 MLOps(데이터 수집부터 모델 학습, 서비스 배포까지를 포함하는 시스템) 의 시작점이라고 할 수 있습니다.

 

1. MNIST 모델

: 손으로 쓴 숫자들로 이루어진 이미지 데이터셋

모듈 임포트

딥러닝을 사용하는데 필요한 라이브러리인 Tensorflow와 keras를 임포트하고,
케라스(Keras)의 모델, 레이어, 옵티마이저, 유틸을 사용할 수 있도록
models, layers, optimizer, utils를 임포트합니다.

 

2. 모델 저장과 로드

 

모델을 열심히 학습시키고 저장을 안한다면 다시 처음부터 학습을 해야합니다. 즉, 어느 정도 학습이 되었다면 추후에 모델을 사용하기 위해서 저장할 필요가 있습니다. 모델을 저장할 때는 save() 함수를 사용하여 쉽게 저장할 수 있고, 다시 모델을 불러올 때는 load_model() 함수를 사용하면 됩니다.
모델을 저장하고 로드하는 것에서 중요한 점은 모델 생성 시에 Sequencial API 또는 Functional API를 사용한 경우에는 모델의 저장 및 로드가 가능하지만 Subclassing API 방식은 사용할 수가 없습니다. Subclassing API 방식은 save_weights()와 load_weights()를 이용해 모델의 파라미터만 저장 및 로드하는 것이 가능합니다.
만약 JSON 형식으로 모델을 저장하려면 to_json()를 사용하여 가능하고, JSON 파일로부터 모델을 로드하려면 model_from_json()을 사용하면 됩니다. 그 밖에도 YAML로 직렬화하여 저장할 경우 to_yaml()를 사용하고, model_from_yaml()를 사용하여 로드하면 됩니다.

model.save('mnist_model.h5')

loaded_model = models.load_model('mnist_model.h5')
loaded_model.summary()
pred_ys2 = loaded_model.predict(x_test)
print(pred_ys2.shape)
print(pred_ys2[0])

 

3. 콜백 (Callbacks)

  • 모델을 fit() 함수를 통해 학습시키는 동안 callbacks 매개변수를 사용하여 학습 시작이나 끝에 호출할 객체 리스트를 여러 개 지정할 수 있습니다. - 콜백의 대표적인 예로는 ModelCheckpoint, EarlyStopping, LearningRateScheduler, Tensorboard가 있습니다.
  • tensorflow.keras.callbacks
from tensorflow.keras import callbacks

3.1 ModelCheckpoint

  • tf.keras.callbacks.ModelCheckpoint : 정기적으로 모델의 체크포인트를 저장하고, 문제가 발생할 때 복구하는데 사용합니다.
check_point_cb = callbacks.ModelCheckpoint('keras_mnist_model.h5')
history = model.fit(x_train, y_train, epochs=10,
                    callbacks=[check_point_cb])
check_point_cb = callbacks.ModelCheckpoint('keras_mnist_model.h5', save_best_only=True)
history = model.fit(x_train, y_train, epochs=10,
                    validation_data=(x_val, y_val),
                    callbacks=[check_point_cb])

3.2 EarlyStopping

  • tf.keras.callbacks.EarlyStopping : 검증 성능이 한동안 개선되지 않을 경우 학습을 중단할 때 사용합니다.

일정 patience 동안 검증 세트에 대한 점수가 오르지 않으면 학습을 멈추게 됩니다. 모델이 향상되지 않으면 학습이 자동으로 중지되므로, epochs 숫자를 크게 해도 무방합니다. 학습이 끝난 후의 최상의 가중치를 복원하기 때문에 모델을 따로 복원할 필요가 없습니다.

check_point_cb = callbacks.ModelCheckpoint('keras_mnist_model.h5', save_best_only=True)
early_stopping_cb = callbacks.EarlyStopping(patience=3, monitor='val_loss',
                                  restore_best_weights=True)
history = model.fit(x_train, y_train, epochs=10,
                    validation_data=(x_val, y_val),
                    callbacks=[check_point_cb, early_stopping_cb])

3.3 LearningRateScheduler

  • tf.keras.callbacks.LearningRateSchduler : 최적화를 하는 동안 학습률(learning_rate)를 동적으로 변경할 때 사용합니다.

에폭 수가 10 미만일 경우는 학습률을 그대로 하고, 10 이상이 되면 -0.1%씩 감소시키는 코드입니다.

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

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

lr_scheduler_cb = callbacks.LearningRateScheduler(scheduler)

history = model.fit(x_train, y_train, epochs=15, callbacks=[lr_scheduler_cb], verbose=0)
round(model.optimizer.lr.numpy(), 5)

 

3.4 Tensorboard

  • tf.keras.callbacks.TensorBoard: 모델의 경과를 모니터링할 때 사용합니다.
  • 텐서보드를 이용하여 학습과정을 모니터링하기 위해서는 logs 폴더를 만들고, 학습이 진행되는 동안 로그 파일을 생성합니다.
  • 텐서보드에는 효율적인 모니터링을 위해서 여러가지 기능들을 제공하고 있습니다.
log_dir = './logs'
tensor_board_cb = [callbacks.TensorBoard(log_dir=log_dir, histogram_freq=1, write_graph=True, write_images=True)]
model.fit(x_train, y_train, batch_size=32, validation_data=(x_val, y_val),
          epochs=30, callbacks=tensor_board_cb)
728x90

'AIFFLE > STARTER' 카테고리의 다른 글

[DL] 7. 모델 크기 조절과 규제  (0) 2024.05.07
[DL] 6. 모델 학습 기술  (0) 2024.05.07
[DL] 3. 딥러닝 구조와 모델  (0) 2024.05.02
[DL] 2. 텐서 표현과 연산  (0) 2024.05.02
[ML] 비지도학습  (0) 2024.05.02