오늘은 Keras의 콜백함수에 대해 공부해봤습니다.
이번 장에서 사용한 데이터는 데이콘 대회를 이용했습니다
콜백 함수란, 특정 이벤트가 발생할 때마다 호출되는 함수입니다.
모델이 global minimum을 찾게하기 위해 동작하는 옵티마이저는 미리 정해둔 동작대로 움직이게 됩니다.
콜백 함수는 특정 이벤트가 발생하면 다시 불리도록 호출합니다.
여기서 이벤트라고 한다면, 모델이 학습할 때 epoch 횟수, val_loss 감소 유무 등 다양할 수 있습니다.
보통 Keras에서는 특정 이벤트가 1epoch 돌아갈 때마다 나타납니다.
케라스에서 자주 사용되는 주요 Callback함수를 알아보겠습니다.
ModelCheckpoint 함수는 케라스 모델이나, 모델의 가중치를 저장해줍니다.
하이퍼 파라미터는 아래와 같습니다.
filepath 파라미터의 경우 "{epoch:02d}-{val_loss:.2f}.weights.h5"와 같이 입력하면 format형식이 지원된다고 하니 공식 문서 참고해주세요.(또한 .h5확장자로 저장하셔야 합니다.)
keras.callbacks.ModelCheckpoint(
filepath, # 저장할 파일 위치
monitor="val_loss", # 저장 평가 기준
verbose=0, # verbose
save_best_only=False, # 가장 성능이 좋은 것만 저장할 지 정함
save_weights_only=False, # 가중치만 저장
mode="auto", # 평가 기준이 낮을수록 좋으면 'min', 높을수록 좋으면 'max', 자동은 'auto'
save_freq="epoch", # 'epoch'면 1 epoch 이후에 callback 적용, integer면 해당 batch마다 적용
initial_value_threshold=None,
)
다음과 같이 적용할 수 있습니다.
INPUT_SIZE = 32
def create_model():
input_tensor = Input(shape=(INPUT_SIZE, INPUT_SIZE))
x = Flatten()(input_tensor)
x = Dense(100, activation='relu')(x)
x = Dense(30, activation='relu')(x)
output = Dense(10, activation='softmax')(x)
model = Model(inputs=input_tensor, outputs=output)
return model
model = create_model()
model_check_cal = ModelCheckpoint(filepath="DACON_IMAGE_CLF{epoch:02d}-{val_loss:.2f}.weights.h5", monitor='val_loss', verbose=1, save_best_only=True, save_weights_only=True, mode='min')
model.compile(metrics=['accuracy'], loss='categorical_crossentropy', optimizer=Adam(0.001))
model.fit(tr_images, oh_tr_labels, batch_size=16, epochs=100, validation_data=(val_images, oh_val_labels), callbacks=[model_check_cal])
checkpoint_filepath = "/content/DACON_IMAGE_CLF24-0.79.weights.h5"
model.load_weights(checkpoint_filepath)
가장 좋은 모델의 성능은 loss가 0.79, accuracy가 0.7749입니다.
EarlyStopping함수는 모델의 성능이 특정 임계 값동안 나아지지 않는 경우 모델의 학습을 멈추는 함수입니다.
restore_best_weights 파라미터의 경우 보통 ModelCheckpoint로 대체합니다.
keras.callbacks.EarlyStopping(
monitor="val_loss",
min_delta=0,
patience=0, # 임계 값
verbose=0,
mode="auto",
baseline=None,
restore_best_weights=False, # 최고의 모델을 저장하는 지
start_from_epoch=0,
)
다음과 같이 적용할 수 있습니다.
INPUT_SIZE = 32
def create_model():
input_tensor = Input(shape=(INPUT_SIZE, INPUT_SIZE))
x = Flatten()(input_tensor)
x = Dense(100, activation='relu')(x)
x = Dense(30, activation='relu')(x)
output = Dense(10, activation='softmax')(x)
model = Model(inputs=input_tensor, outputs=output)
return model
model = create_model()
erl_cal = EarlyStopping(monitor='val_loss', patience=10)
model.compile(metrics=['accuracy'], loss='categorical_crossentropy', optimizer=Adam(0.001))
model.fit(tr_images, oh_tr_labels, batch_size=16, epochs=100, validation_data=(val_images, oh_val_labels), callbacks=[erl_cal])
100번 epoch중 35번 째 epoch에서 학습을 멈췄습니다.
모델의 성능은 loss가 0.87, accuracy가 0.7413입니다.
EarlyStopping의 경우 모델의 과적합을 막아줄 수 있습니다.
ReduceLROnPlateau는 특정 epoch마다 LearningRate에 factor를 곱해줍니다.
keras.callbacks.ReduceLROnPlateau(
monitor="val_loss",
factor=0.1, # LearningRate에 곱할 값
patience=10, # 특정 epoch
verbose=0,
mode="auto",
min_delta=0.0001,
cooldown=0,
min_lr=0.0,
**kwargs
)
다음과 같이 적용할 수 있습니다.
INPUT_SIZE = 32
def create_model():
input_tensor = Input(shape=(INPUT_SIZE, INPUT_SIZE))
x = Flatten()(input_tensor)
x = Dense(100, activation='relu')(x)
x = Dense(30, activation='relu')(x)
output = Dense(10, activation='softmax')(x)
model = Model(inputs=input_tensor, outputs=output)
return model
model = create_model()
reduce_lr_cal = ReduceLROnPlateau(monitor='val_loss', factor=0.1, patience=10, verbose=1, mode='min')
model.compile(metrics=['accuracy'], loss='categorical_crossentropy', optimizer=Adam(0.001))
model.fit(tr_images, oh_tr_labels, batch_size=16, epochs=100, validation_data=(val_images, oh_val_labels), callbacks=[reduce_lr_cal])
특정 epoch마다 learning rate가 감소했습니다.
모델의 성능은 loss가 0.90, accuracy가 0.7844입니다.