AI(DeepLearning)

Custom EarlyStopping

크레이지제이 2019. 11. 11. 10:20
반응형
CustomEarlyStop

Custom EarlyStopping

EarlyStop 클래스는 학습을 조기 종료시킬 때 사용한다. 학습을 무조건 많이 시킨다고 성능이 좋아지는 것은 아니다. 오히려 과적합이 발생하여 실제 테스트 데이터에 적용시 성능이 떨어질 수 있다.
따라서 어느정도가 적합한지를 자동으로 측정하는 역할을 한다.

EarlyStopping

keras.callbacks.EarlyStopping(monitor='val_loss', min_delta=0, patience=0, 
verbose=0, mode='auto', baseline=None, restore_best_weights=False)

Arguments

  • monitor : 모니터링 대상. loss, val_loss, score, val_score, val_f1_score 등 메트릭 정보를 입력한다.
  • min_delta : 최소 감지 변화량을 의미한다. 이 값보다 적은 변화는 변화(개선)가 없다고 인식한다.
  • patience : 인내할 횟수. monitor 값의 변화 감지가 개선되는 쪽으로 patience 횟수만큼 연속으로 없을 경우, 학습을 Stop하게 된다. 예를 들어 loss가 1.0이었는데, 10번 연속으로 1.0 이하로 떨어지지 않으면 학습을 중지한다. (patience=10일때) 성능은 매 epoch마다 항상 좋아지지 않고 약간 들쭉날쭉하면서 좋아지는 경향들이 있다. 이 값이 너무 커지면 학습을 너무 오래할 수 있고, 너무 작으면 너무 일찍 학습이 종료될 수 있다.
    따라서 Checkpoint와 함께 사용하여 best 상태를 항상 기록하도록 설정하는 것이 좋다.
  • baseline : monitor 값이 도달할 기본값. baseline을 넘어 개선이 이루어 지지 않으면 학습을 중지한다. (이 파라미터는 잘 안쓴다.)
  • restore_best_weights: monitor 값의 최상치일때의 weights들로 복원한다.

Custom EarlyStopping

위 EarlyStopping을 좀 수정하여 처음 100 에폭은 무조건 학습하고, 100에폭이 넘으면 그 때부터 EarlyStopping을 사용하고 싶을 때 아래와 같이 만들 수 있다.
(StackOverflow 참고)

class CustomStopper(keras.callbacks.EarlyStopping):
    def __init__(self, monitor='val_loss',
                 min_delta=0, patience=0, verbose=0, 
                 mode='auto', start_epoch = 100): # add argument for starting epoch
                super(CustomStopper, self).__init__()
                self.start_epoch = start_epoch
                
    def on_epoch_end(self, epoch, logs=None):
            if epoch > self.start_epoch:
                    super().on_epoch_end(epoch, logs)

Author: crazyj7@gmail.com