Data Analysis & ML/Deep Learning

[Deep Learning][딥러닝] 모델저장 / Callback

YSY^ 2021. 1. 24. 15:55

모델은 아래 MNIST CNN모델을 활용

ysyblog.tistory.com/151?category=1150980

 

[Deep Learning][딥러닝] CNN MNIST 분류

MNIST 데이터에 CNN 적용 하이퍼파라미터 및 데이터셋 전처리 import tensorflow as tf import tensorflow.keras as keras import tensorflow.keras.layers as layers import numpy as np np.random.seed(1) tf.ra..

ysyblog.tistory.com

 

모델 저장

  • 딥러닝은 모델을 만드는데 오래걸리기 때문에 이 모델을 따로 저장해 놓을 필요가 있다. 모델을 저장하는 방법은 다음과 같다.
  1. 학습이 끝난 모델의 파라미터만 저장
  2. 모델 전체 저장
  3. Callback 함수를 이용해 학습시 가장 좋은 지표의 모델 저장

학습한 Weight (파라미터) 저장 및 불러오기

  • 가중치를 저장하여 나중에 재학습 없이 학습된 가중치를 사용할 수 있다.
  • 저장: model.save_weights("저장경로")
  • 불러오기: model.load_weights('불러올경로')
  • 저장형식
    • Tensorflow Checkpoint (기본방식)
    • HDF5
      • save_weights(.., save_format='h5')
import os
cur_dir = os.getcwd() #현재 작업디렉토리
ckpt_dir = 'checkpoints' #weight를 저장할 디렉토리
file_name = 'mnist_cnn_weights.ckpt' #저장파일명

dir = os.path.join(cur_dir, ckpt_dir)
os.makedirs(dir, exist_ok=True)

file_path = os.path.join(dir, file_name)
print(file_path)
# 모델의 weight들을 저장.
model.save_weights(file_path)

!ls -al /content/checkpoints

 

# 가중치 불러오기
# 모델 생성
new_model = create_model()
new_model.compile(optimizer=keras.optimizers.Adam(learning_rate),
                  loss='categorical_crossentropy',
                  metrics=['accuracy'])

new_model.evaluate(test_dataset) #loss: 2.3040 - accuracy: 0.0910
# 새 모델에 저장된 가중치 설정
new_model.load_weights(file_path)

new_model.evaluate(test_dataset) #loss: 0.0300 - accuracy: 0.9940

 

전체 모델 저장하고 불러오기

  • 저장: model.save('저장할디렉토리')
  • 불러오기: tf.keras.models.load_model('저장파일경로')
  • 저장 형식

HDF5 형식으로 저장

model_h5_dir = 'save_model/h5'
model_h5_path = os.path.join(cur_dir, model_h5_dir)
model_h5_file = os.path.join(model_h5_path, 'mnist_cnn_h5_model.h5')
os.makedirs(model_h5_path, exist_ok=True)
# 학습한 모델 저장. 모델구조+컴파일내용+weight 모두 저장.
model.save(model_h5_file, save_format='h5')

# 저장한 모델 불러오기
new_model2 = keras.models.load_model(model_h5_file)
new_model2.summary()

 

new_model2.evaluate(test_dataset) # loss: 0.0300 - accuracy: 0.9940

tensorflow SaveModel 형식으로 저장

#SaveModel 형식은 저장할 디렉토리까지 지정한다.
save_model_path = os.path.join(cur_dir, 'save_model/saved_model/mnist_cnn_sm')
print(save_model_path)

model.save(save_model_path)
# 모델 불러오기
new_model3 = keras.models.load_model(save_model_path)
new_model3.summary()

 

new_model3.evaluate(test_dataset) #loss: 0.0300 - accuracy: 0.9940

 

Callback을 사용한 모델 저장 및 Early Stopping

  • callback은 학습시 특정 이벤트 발생시 호출되는 다양한 함수를 제공하여 자동화 처리를 지원한다. (cf: 프로그래밍의 콜백함수)
  • 다양한 콜백 클래스가 제공된다.
  • EarlyStopping: Validation set에 대한 평가지표가 더 이상 개선되지 않을 때 학습을 자동으로 멈춤
    • monitor: 모니터링할 평가지표 지정. (ex: accuracy)
    • patience: epoch 수 지정. validation 평가 지표가 개선이 안되더라도 지정한 epoch만큼 반복한다. 지정한 epoch만큼 반복 후에도 개선이 되지 않으면 중단한다.
  • ModelCheckpoint: 지정한 평가지표(예:validation loss)가 가장 좋을 때 모델과 weight를 저장하여 overfitting이 발생하기 전의 model을 나중에 불러들여 사용할 수 있음
    • save_best_only=True: monitoring 중인 measure를 기준으로 최적의 모형의 weight만 저장
  • callback 객체들을 리스트로 묶은 뒤 fit()의 callback 매개변수에 전달한다.
model = create_model()
model.compile(optimizer='adam', 
              loss='categorical_crossentropy',
              metrics=['accuracy'])


ckpt_path = os.path.join(cur_dir, 'callback_ckpt')
os.makedirs(ckpt_path, exist_ok=True)

ckpt_filepath = os.path.join(ckpt_path, 'mnist_cnn_{epoch}.ckpt')
print(ckpt_filepath)
# callback 생성
# epoch마다 학습한 weight들을 저장하는 callback
ckpt_callback = keras.callbacks.ModelCheckpoint(filepath=ckpt_filepath,
                                                save_weights_olny=True #True:weight만저장, False: 모델까지 저장.
                                                )
# early stopping callback
early_stop_callback = keras.callbacks.EarlyStopping(monitor='val_loss', patience=10)
history = model.fit(train_dataset, epochs=N_EPOCHS, steps_per_epoch=steps_per_epoch,
                    validation_data=test_dataset, validation_steps=validation_steps,
                    callbacks=[ckpt_callback, early_stop_callback])

 

728x90
반응형