본문 바로가기

TIL(Today I Learned)

모델 저장과 Callback

01.  MNIST 모델 예제

- 딥러닝을 처음 배우는 사람들이 만나게 되는 데이터셋 중 하나인 손으로 쓴 숫자들로 이루어진 이미지 데이터셋

1.데이터 로드 및 전처리

02. 모델 저장과 로드

- 모델을 학습시키고 저장을 안한다면 다시 처음 부터 학습을 시켜야함

- 어느정도 학습이 되었다면 추후에 모델을 사용하기 위해 저장할 필요가 있음

- 모델을 저장할때는 save()함수를 사용

- 모델을 다시 불러오는데에는 load_model()함수를 사용

- 모델을 저장하고 로드하는 것에서 중요한 점은 모델 생성시에 Sequencial API or Runctional API를 사용한 경우에는 모델의 저장및 로드가 가능 but Subclasing API방식은 사용할 수 없음

- Subclassing API 방식은 save_weights()와 load_weights()를 이용해 모델의 파라미터만 저장 및 로드하는 것이 가능

 

- 만약 JSON 형식으로 모델을 저장하려면 to_json()를 사용하여 가능

- JSON 파일로부터 모델을 로드하려면 model_from_json()을 사용

 

실습 

# 모델 저장
model.save('mnist_model.h5')

# 모델 불러오기
loaded_model = models.load_model('mnist_model.h5')

# 로드한 모델로 예측하기 
pred_ys2 = loaded_model.predict(x_test)
print(pred_ys2.shape)
print(pred_ys2[0])
-> 
'''
(10000, 10)
[1.6814009e-05 2.7725261e-07 2.0499426e-04 1.0273759e-03 4.7567480e-07
 1.9240513e-05 2.6720942e-10 9.9817955e-01 2.1008995e-05 5.3029525e-04]
'''

# 예측값 시각화 하기
arg_pred = np.argmax(pred_y , axit = 1)
plt.title(f'Predicted label: {arg_pred_y[0]}')
plt.imshow(x_test[0])
plt.show()

 

# to_json()함수로 모델 저장하기 

# 위에서 학습시킨 model의 구조를 json 형식으로 model_json에 저장합니다.
model_json = model.to_json()

# json으로 저장한 모델을 읽어옵니다.
loaded_model = keras.models.model_from_json(model_json)

predictions = loaded_model.predict(x_test)
print(predictions.shape)
print(predictions[0])
'''
(10000, 10)
[1.6814009e-05 2.7725261e-07 2.0499426e-04 1.0273759e-03 4.7567480e-07
 1.9240513e-05 2.6720942e-10 9.9817955e-01 2.1008995e-05 5.3029525e-04]
'''

# 시각화

arg_pred = np.argmax(predictions, axis = 1)
plt.title(f'Predicted label: {arg_pred_y[0]}/ Json')
plt.imshow(x_test[0])
plt.show()

 

03.  Callbacks

- fit()함수를 통해 모델을 학습시키는 동안 callbacks 매개변수를 사용하여 학습시작이나 끝에 호출할 객체 리스트를 여러개 지정가능

 

1. ModelCheckpoint

- 정기적으로 모델의 체크포인트를 저장하고, 문제가 발생할 때 복구하는데 사용

check_point_cb = callbacks.ModelCheckpoint('keras_mnist_model.h5')
history = model.fit(x_train, y_train, epochs=10,
                    callbacks=[check_point_cb])
                    
# 최상의 모델만을 저장하는 옵션으로 save_best_only=True를 지정
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])

2. 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. LearningRateScheduler

- 최적화를 하는 동안 학습률을 동적으로 변경할 때 사용

# 에폭 수가 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)

4. 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)
          
%load_ext tensorboard
%tensorboard --logdir {log_dir}