카테고리 없음

Keras Callback 함수 (keras documentation 참조)

QunLee 2021. 9. 8. 15:35

지난번에는 keras callback 함수 중 하나 인 early stopping을 알아보았다. 이번에는 다른 다양한 keras callback 함수를 알아볼 것이다.

 

1. Callback

1
keras.callbacks.Callback()
cs

새로운 콜백을 만드는데 사용되는 추상 베이스 클래스이다.

 

특성

 

params : 딕셔너리, 학습, 매개변수(예. 다변모드, 배치 크기, 세대 수.. 등)

model : keras.models.Model의 인스턴스, 학습 중인 모델의 참조

 

콜백 메서드가 인수로 받는 logs 딕셔너리는 현재 배치 혹은 세대에 적절한 수치에 대한 키를 담는다.

 

현재 Sequential 모델 클래스의 fit메서드는 콜백이 전달하는 logs에 다음 수치를 포함한다.

  • on_epoch_end : 로그에 acc와 loss가 포함되고 val_acc와 val_loss는 선택적으로 포함된다.
  • on_batch_begin : 로그에는 size와 현재 배치의 샘플 수가 포함된다. 
  • on_batch_end : 로그에는 loss가 포함되고, 선택적으로 acc가 포함된다.

 

2. BaseLogger

1
keras.callbacks.BaseLogger(stateful_metrics=None)
cs

측정 항목의 세대평균을 축적하는 콜백이며 모든 케라스 모델에 자동적으로 적용된다.

인수

  • stateful_metrics : 세대에 걸쳐 평균을 내면 안되는 측정 항목의 문자열 이름의 lterable. on_epoch_end에서는 이 리스트의 측정 항목을 원본 그대로 로그한다. 그 외 측정 항목은 on_epoch_end에서 평균을 구해 로그한다. 

 

3. TerminateOnNaN

1
keras.callbacks.TerminateOnNaN()
cs

NaN손실이 발생했을 때 학습을 종료시키는 콜백

 

4. ProgbarLogger

1
keras.callbacks.ProgbarLogger(count_mode='samples', stateful_metrics=None)
cs

측정 항목을 stdout에 프린트하는 콜백

 

인수

  • count_mode : "steps" 혹은 "samples" 중 하나. 진행 표시줄이 검사한 샘플의 수에 기반하는지 검사한 단계(배치)의 수에 기반하는지 여부
  • stateful_metrics : 세대에 걸쳐 평균을 내면 안되는 측정 항목의 문자열 이름의 lterable. 그 외 측정 항목은 평균을 구해 로그한다. (ex. 손실 등)

오류알림

  • ValueError : 유효하지 않은 count_mode의 경우 오류를 알린다.

 

5. History

1
keras.callbacks.History()
cs

History객체에 이벤트를 기록하는 콜백으로 케라스 모델에 자동적으로 적용된다. History객체는 모델의 fit메서드를 통해 반환된다.

 

6. ModelCheckpoint

1 keras.callbacks.ModelCheckpoint(filepath, monitor='val_loss', verbose=0, save_best_only=False, save_weights_only=False, mode='auto', period=1) cs

각 세대후 모델을 저장한다.

 

filepath는 (on_epoch_end에서 전달되는) epoch의 값과 log의 키로 채워진 이름 형식 옵션을 가질 수 있다.

예를 들어 filepath가 weights.{epoch:02d}-{val_loss:.2f}.hdf5라면 파일 이름에 세대 번호와 검증 손실을 넣어 모델의 체크포인트가 저장된다.

 

인수

  • filepath : 문자열, 모델 파일을 저장할 경로
  • monitor : 관찰할 수량
  • verbose : 다변 모드 0 or 1
  • save_best_only : save_weights_only = True인 경우 관찰하는 수량을 기준으로 가장 최신의 최고 모델은 덧씌우지 않는다.
  • mode : auto, max, min 중 하나로 save_best_only = True 이면 현재 저장 파일을 덧씌울지는 관찰하는 수량의 최대화 혹은 최소화를 기준으로 결정한다. val_acc의 경우 이는 max가 되어야 하며, val_loss라면 min이 되어야 한다. auto의 경우 관찰하는 수량의 이름에서 방향성이 자동적으로 유추된다.
  • save_weights_only : 참인 경우 모델의 가중치만 저장되고 (model.save_weights(filepath)), 아닌 경우 전체 모델이 저장된다. (model.save(filepath))
  • period : 체크포인트간 간격(세대의 수)

 

7. Early Stopping

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

관찰하는 수량이 개선되지 않으면 학습을 멈추는 콜백

 

인수

  • monitor : 관찰할 수량
  • min_delta : 관찰하는 수량이 향상되었다고 판단할 최소한의 변화 즉, min_delta 미만의 절대적 변화는 향상되었다고 판단하지 않는다.
  • patience : 몇 세대가 향상없이 지나야 학습이 멈추는지 결정하는 세대 수
  • verbose : 다변 모드
  • mode : auto, min, max 중 하나. min모드에서는 관찰하는 수량이 더 이상 감소하지 않으면 학습이 멈춘다. max모드에서는 관찰하는 수량이 더 이상 증가하지 않으면 학습이 멈춘다. auto모드에서는 관찰하는 수량의 이름에서 방향성이 자동으로 유추된다.
  • baseline : 관찰하는 수량이 도달해야 하는 베이스라인 값. 모델이 베이스라인을 초과하는 향상을 보이지 않으면 학습을 멈춘다.
  • restore_best_weights : 관찰하는 수량의 최선 값이 발생한 세대에서 모델 가중치를 복원할지 여부. 거짓은 경우 학습의 마지막 단계에서 얻어진 모델 가중치가 사용된다.  

8. RemoteMonitor 

1 keras.callbacks.RemoteMonitor(root='http://localhost:9000', path='/publish/epoch/end/', field='data', headers=None, send_as_json=False) cs

이벤트를 서버에 스트림할 콜백

 

requests 라이브러리를 필요로 한다. 디폴드 설정으로 이벤트는 root + '/publish/epoch/end/'으로 보내집니다. 호출은 HTTP POST와 JSON-인코딩 이벤트 데이터 딕셔너리인 data인수로 한다. send_as_json이 참으로 설정된 경우, 요청의 내용 종류는 send_as_json이 참으로 설정된 경우, 요청의 내용 종류는 application/json이다. 그 외는 형식 내 직렬화된 JSON이 보내진다.

 

인수

  • root : 문자열; 표적 서버의 최상위 url
  • path : 문자열; 이벤트가 보내질 root를 기준으로 한 상대적 경로
  • field : 문자열; 데이터가 저장될 JSON필드. 형식 내 payload가 보내지는 경우에만 필드가 사용된다. (send_as_json=False인 경우)
  • headers : 딕셔너리; 선택적 커스텀 HTTP해더
  • send_as_json : 불리언; 요청을 application/json으로 보내지는 여부

 

9. LearningRateScheduler 

1 keras.callbacks.LearningRateScheduler(schedule, verbose=0) cs

학습 속도 스케쥴러

 

인수

  • schedule : 세대 색인(정수, 0에서 색인 시작)과 현재 학습 속도를 인풋으로 받고, 새로운 학습 속도를 아웃풋(부정소수점)으로 반환 하는 함수
  • verbose : 0 :자동, 1 : 최신화 메세지

 

10. TensorBoard

1
keras.callbacks.TensorBoard(log_dir='./logs', histogram_freq=0, batch_size=32, write_graph=True, write_grads=False, write_images=False, embeddings_freq=0, embeddings_layer_names=None, embeddings_metadata=None, embeddings_data=None, update_freq='epoch')
cs

텐서플로우가 제공하는 시각화 도구

 

이 콜백은 TensorBoard에 로그를 기록하여 학습과 테스트 측정 항목에 대한 동적 그래프나 모델 내 다양한 레이어에 대한 활성화 히스토그램을 시각화 할 수 있도록 한다.

 

pip으로 텐서플로우를 설치 후에 다음 명령 줄에서 TensorBoard를 시작 할 수 있다.

1
tensorboard --logdir=/full_path_to_your_logs
cs

텐서플로우 외의 벡엔드를 사용하는 경우에도(텐서플로우가 설치만 되어 있다면) TensorBoard가 작동하긴 하지만 손실과 측정 항목 플롯을 보여주는 기능만 사용 가능하다.

 

인수

  • log_dir : TensorBoard가 구문 분석할 로그 파일을 저장할 위치 경로
  • histogram_freq : 모델의 레이어에 대해 할성화와 가중치 히스토그램을 계산할(세대 내) 빈도. 0으로 설정 되어 있으면 히스토그램을 계산하지 않습니다. 히스토그램을 시각화 하려면 검증 데이터(혹은 데이터 조각)이 특정되어야 한다.
  • write_graph : TensorBoard에서 그래프를 시각화 할지에 대한 여부. write_graph가 참으로 설정되어 있으면 로그 파일이 상당히 커질 수 있다.
  • batch_size : 히스토그램 계산 목적으로 네트워크에 전달할 인풋 배치의 크기
  • write_images : TensorBoard에서 이미지로 시각화할 모델 가중치를 작성할 지에 대한 여부
  • write_grads : TensorBoard에서 경사 히스토그램을 시각화할지에 대한 여부. histogram_freq가 0보다 커야 한다. 
  • embeddings_freq : 선택된 임베딩 레이어가 저장되는 (세대 내) 빈도. 0으로 설정되어 있으면 임베딩 계산이 되지 않는다. TensorBoard의 Embedding 탭에서 시각화할 데이터는 embedding_data로 전달되어야 한다.
  • embeddings_layer_names : 관찰할 레이어 이름의 리스트. None이나 빈 리스트의 경우 모든 임베딩 레이어가 관찰된다.
  • embedding_metadata : 레이어 이름을 해당 임베딩 레이어의 메타데이터가 저장되는 파일 이름에 매핑하는 딕셔너리. 모든 임베딩 레이어에 대해서 동일한 메타데이터 파일이 사용되는 경우 문자열을 전달할 수 있습니다.
  • embeddings_data : embeddings_layer_names에 특정되어 레이어에 임베딩할 데이터.  Numpy 배열(모델이 하나의 인풋을 갖는 경우) 혹은 Numpy배열의 리스트(모델이 여러개 인풋을 갖는 경우).
  • update_freq : 'batch', 'epoch', 혹은 정수. 'batch'를 사용하는 경우 각 배치 이후 손실과 특정 항목을 TensorBoard에 기록한다. 'epoch' 경우도 마찬가지. 정수를 사용하는 경우 예를 들어 1000이라면 1000샘플마다 콜백이 측정 항목과 손실을 TensorBoard에 작성한다. TensorBoard에 너무 자주 기록하면 학습이 느려질 수 있다.

 

11. ReduceLROnPlateau

1
keras.callbacks.ReduceLROnPlateau(monitor='val_loss', factor=0.1, patience=10, verbose=0, mode='auto', min_delta=0.0001, cooldown=0, min_lr=0)
cs

측정 항목이 향상되지 않는 경우 학습 속도를 줄이는 콜백

 

모델은 종종 학습이 부진할 때 학습속도를 2-10의 인수로 줄여 효과를 보기도 한다. 이 콜백은 수량을 관찰하여 'patience'수의 세대 동안 향상 되는 기미가 없으면 학습속도를 줄인다.

 

예시

1
2
3
reduce_lr = ReduceLROnPlateau(monitor='val_loss', factor=0.2,
                              patience=5, min_lr=0.001)
model.fit(X_train, Y_train, callbacks=[reduce_lr])
cs

인수

  • monitor : 관찰할 수량
  • factor : 학습 속도를 줄인 인수. new_lr = lr * factor
  • patience : 얼마나 많은 세대간 학습이 부진하면 학습 속도를 줄일지 결정하는 세대의 수
  • verbose : 0 : 자동, 1 : 최신화메세지
  • mode : auto, min, max 중 하나. min모드에서는 관찰하는 수량이 더 이상 감소하지 않으면 학습이 멈춘다. max모드에서는 관찰하는 수량이 더 이상 증가하지 않으면 학습이 멈춘다. auto모드에서는 관찰하는 수량의 이름에서 방향성이 자동으로 유추된다.
  • min_delta : 유의미한 변화에만 집중해 새로운 최적값을 계산할 한계점
  • cooldown : 학습 속도가 감소 된 후 몇 세대를 기다려야 평소 가동이 재개되는지를 결정하는 세대의 수
  • min_lr : 학습 속도에 대한 하한선.

 

12. CSVLogger

1
keras.callbacks.CSVLogger(filename, separator=',', append=False)
cs

세대 결과를 csv파일에 스트림하는 콜백

 

np.ndarray와 같은 1D interalbe을 포함 문자열로 표현하는 모든 값을 지원한다.

 

예시

1
2
csv_logger = CSVLogger('training.log')
model.fit(X_train, Y_train, callbacks=[csv_logger])
cs

 

인수

  • filename : csv파일의 파일 이름
  • separator : csv파일의 성분을 분리하는데 사용하는 문자열
  • append : True일 때 파일이 존재하는 경우 뒤에 덧붙인다.(학습을 이어나갈 때 유용한 방법) False일 때 기존의 파일을 덧씌운다.

 

13. LambdaCallback

1
keras.callbacks.LambdaCallback(on_epoch_begin=None, on_epoch_end=None, on_batch_begin=None, on_batch_end=None, on_train_begin=None, on_train_end=None)
cs

간단한 커스텀 콜백을 즉석에서 만드는 콜백

 

이 콜백은 적절한 시점에 호출될 익명 함수로 생성된다. 콜백이 다음과 같이 위치적 인수를 전달 받는 것을 참조하자

 

  • on_epoch_begin과 on_epoch_end는 다음 두 가지 위치적 인수를 전달 받는다. epoch, logs
  • on_batch_begin과 on_batch_end는 다음 두 가지 위치적 인수를 전달 받는다. batch, logs
  • on_train_begin과 on_train_end는 다음 위치적 인수를 전달 받는다. logs

인수

  • on_epoch_begin : 각 세대의 시작에 호출된다.
  • on_epoch_end : 각 세대의 끝에 호출된다.
  • on_batch_begin : 각 배치의 시작에 호출된다.
  • on_batch_end : 각 배치의 끝에 호출된다.
  • on_train_begin : 모델 학습 시작에 호출된다.
  • on_train_end : 모델 학습 끝에 호출된다.

예시

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
# 각 배치가 시작할 때 배치 번호를 프린트합니다
batch_print_callback = LambdaCallback(
    on_batch_begin=lambda batch,logs: print(batch))
 
# 세대 손실을 JSON 형식으로 파일에 스트림합니다
# 파일 내용은 명확히 구성된 JSON이 아니며 줄 별로 JSON 객체를 가집니다
import json
json_log = open('loss_log.json', mode='wt', buffering=1)
json_logging_callback = LambdaCallback(
    on_epoch_end=lambda epoch, logs: json_log.write(
        json.dumps({'epoch': epoch, 'loss': logs['loss']}) + '\n'),
    on_train_end=lambda logs: json_log.close()
)
 
# 모델 학습을 끝낸 후 몇몇 처리 과정을 종료합니다
processes = ...
cleanup_callback = LambdaCallback(
    on_train_end=lambda logs: [
        p.terminate() for p in processes if p.is_alive()])
 
model.fit(...,
          callbacks=[batch_print_callback,
                     json_logging_callback,
                     cleanup_callback])
cs