article thumbnail image
Published 2022. 2. 14. 21:11

목차

  1. Callback 개요
  2. ModelCheckpoint
  3. ReduceLROnPlateau : Loss가 줄지 않거나 성능이 향상되지 않을 때, Learning rate를 바꿈
  4. EarlyStopping : 성능이 변하지 않을 때 멈춤
  5. 보통은 세개를 한꺼번에 다 쓴다.

Callback 개요

 

함수를 호출하는 것보다는 등록을 한다.

그러면 Callback 함수는 루프를 돌 때마다 특정한 이벤트가 발생할 때마다 등록된 Callback을 호출하게 된다.

Roop시에 중간중간 함수가 돌아갈 수 있게끔 하는 프레임워크이다.

 


ModelCheckpoint

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

  • 특정 조건에 맞춰서 모델을 파일로 저장
  • filepath: filepath는 (on_epoch_end에서 전달되는) epoch의 값과 logs의 키로 채워진 이름 형식 옵션을 가질 수 있음.
    예를 들어 filepath가 weights.{epoch:02d}-{val_loss:.2f}.hdf5라면, 파일 이름에 세대 번호와 검증 손실을 넣어 모델의 체크포인트가 저장
  • monitor: 모니터할 지표(loss 또는 평가 지표)
  • save_best_only: 가장 좋은 성능을 나타내는 모델만 저장할 여부
  • save_weights_only: Weights만 저장할 지 여부
  • mode: {auto, min, max} 중 하나.
    monitor 지표가 감소해야 좋을 경우(loss) min, 증가해야 좋을 경우(mse) max, auto는 monitor 이름에서 자동으로 유추.

 

오랜시간, 거의 2주를 돌려야되는 모델이 최적 weight로 저장이 되면 파일로 저장을 시키고 내일 다시 load를 시키면 된다.

그러나 주기적으로 저장을 시켜주는 것이 좋다.

왜냐면 오류가 생기거나 그럴 수 있기 때문이다.

그럴 때 ModelCheckpoint를 이용한다.

 

ex code)

from tensorflow.keras.callbacks import ModelCheckpoint

model = create_model()
model.compile(optimizer=Adam(0.001), loss='categorical_crossentropy', metrics=['accuracy'])

mcp_cb = ModelCheckpoint(filepath='/kaggle/working/weights.{epoch:02d}-{val_loss:.2f}.hdf5', monitor='val_loss', 
                         save_best_only=True, save_weights_only=True, mode='min', period=3, verbose=1)
history = model.fit(x=tr_images, y=tr_oh_labels, batch_size=128, epochs=10, validation_data=(val_images, val_oh_labels),
                   callbacks=[mcp_cb])

ReduceLROnPlateau

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

  • 특정 epochs 횟수동안 성능이 개선 되지 않을 시 Learning rate를 동적으로 감소 시킴
  • monitor: 모니터할 지표(loss 또는 평가 지표)
  • factor: 학습 속도를 줄일 인수. new_lr = lr * factor
  • patience: Learing Rate를 줄이기 전에 monitor할 epochs 횟수.
  • mode: {auto, min, max} 중 하나. monitor 지표가 감소해야 좋을 경우 min, 증가해야 좋을 경우 max, auto는 monitor 이름에서 유추.

 

안정기에 달하는 시점까지 learning rate를 줄이는 방법이다.

from tensorflow.keras.callbacks import ReduceLROnPlateau

model = create_model()
model.compile(optimizer=Adam(0.001), loss='categorical_crossentropy', metrics=['accuracy'])

rlr_cb = ReduceLROnPlateau(monitor='val_loss', factor=0.3, patience=3, mode='min', verbose=1)
history = model.fit(x=tr_images, y=tr_oh_labels, batch_size=128, epochs=30, validation_data=(val_images, val_oh_labels),
                   callbacks=[rlr_cb])

 


EarlyStopping

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

  • 특정 epochs 동안 성능이 개선되지 않을 시 학습을 조기에 중단
  • monitor: 모니터할 지표(loss 또는 평가 지표)
  • patience: Early Stopping 적용 전에 monitor할 epochs 횟수.
  • mode: {auto, min, max} 중 하나. monitor 지표가 감소해야 좋을 경우 min, 증가해야 좋을 경우 max, auto는 monitor 이름에서 유추.

 

아예 학습을 안하고 중지를 시켜버린다.

최소점을 찾았는데, 끝까지 학습하지 않아도 된다고 판단될 때,

학습의 loss는 줄어드는데, validation loss는 점점 증가할 때,

명백한 overfitting일 때,

그때는 멈추어야 한다.

 

from tensorflow.keras.callbacks import EarlyStopping

model = create_model()
model.compile(optimizer=Adam(0.001), loss='categorical_crossentropy', metrics=['accuracy'])

ely_cb = EarlyStopping(monitor='val_loss', patience=3, mode='min', verbose=1)
history = model.fit(x=tr_images, y=tr_oh_labels, batch_size=128, epochs=30, validation_data=(val_images, val_oh_labels),
                   callbacks=[ely_cb])

보통은 세개를 한꺼번에 다 쓴다.

from tensorflow.keras.callbacks import ModelCheckpoint, ReduceLROnPlateau, EarlyStopping

model = create_model()
model.compile(optimizer=Adam(0.001), loss='categorical_crossentropy', metrics=['accuracy'])

mcp_cb = ModelCheckpoint(filepath='/kaggle/working/weights.{epoch:02d}-{val_loss:.2f}.hdf5', monitor='val_loss', 
                         save_best_only=True, save_weights_only=True, mode='min', period=1, verbose=0)
rlr_cb = ReduceLROnPlateau(monitor='val_loss', factor=0.3, patience=5, mode='min', verbose=1)
ely_cb = EarlyStopping(monitor='val_loss', patience=7, mode='min', verbose=1)

history = model.fit(x=tr_images, y=tr_oh_labels, batch_size=128, epochs=40, validation_data=(val_images, val_oh_labels),
                   callbacks=[mcp_cb, rlr_cb, ely_cb])

 

'🖼 Computer Vision > CNN' 카테고리의 다른 글

CNN - Kernel & Feature map  (0) 2022.02.15
CNN - Convolution 연산의 이해  (0) 2022.02.15
CNN - Fashion_MNIST 분석  (0) 2022.02.12
Fashion_mnist 예측 모델 구현하기  (0) 2022.01.27
CNN - Functional API  (0) 2022.01.21
복사했습니다!