Deep Learning 모델저장 및 Callback
모델은 아래 MNIST CNN모델을 활용
ysyblog.tistory.com/151?category=1150980
모델 저장
- 딥러닝은 모델을 만드는데 오래걸리기 때문에 이 모델을 따로 저장해 놓을 필요가 있다. 모델을 저장하는 방법은 다음과 같다.
- 학습이 끝난 모델의 파라미터만 저장
- 모델 전체 저장
- 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 형식
save(..., save_format='h5')
로 지정한다.
- Tensorflow SavedModel 형식(기본방식)
- 모델 아키텍처 및 훈련 구성(옵티마이저, 손실 및 메트릭 포함)은 saved_model.pb 에 저장된다.
- 파라미터는 variables/ 디렉토리에 저장된다.
- https://www.tensorflow.org/guide/saved_model?hl=ko#the_savedmodel_format_on_disk
- HDF5 형식
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
반응형
'Data Analysis & ML > Deep Learning' 카테고리의 다른 글
[Deep Learning][딥러닝] FunctionalAPI (0) | 2021.01.25 |
---|---|
[Deep Learning][딥러닝] CNN Image Augmentation(이미지 증식) (0) | 2021.01.24 |
[Deep Learning][딥러닝] CNN MNIST 분류 (0) | 2021.01.24 |
[Deep Learning][딥러닝] CNN_MNIST분류 / 모델저장/ FunctionalAPI (0) | 2020.11.09 |
[Deep Learning][딥러닝] CNN 개요 (0) | 2020.11.09 |