[파이썬] Keras 모델 체크포인트 및 복구

디자인한 Keras 모델을 학습시키는 도중에 예기치 않은 문제가 발생할 수 있습니다. 이러한 경우, 모델을 다시 학습하기 위해 처음부터 시작해야 할 수도 있습니다. 이는 시간과 컴퓨팅 자원을 낭비할 수 있습니다.

다행히도, Keras는 모델의 학습 과정 중간에 체크포인트를 저장하여 이러한 문제를 해결하는 기능을 제공합니다. 이러한 체크포인트는 모델의 가중치, 최적화기(optimizer) 상태, 학습 횟수 등을 저장하며, 필요할 때 모델의 학습을 중단한 시점부터 재개할 수 있도록 도와줍니다.

체크포인트 만들기

Keras에서 체크포인트를 만들기 위해 ModelCheckpoint 콜백을 사용합니다. 이 콜백은 원하는 지점마다 모델을 저장할 수 있는 유연한 설정을 제공합니다. 일반적으로는 모델의 최상의 성능을 갖는 체크포인트를 저장하기 위해 학습률이 낮아지는 시점마다 체크포인트를 저장하도록 설정합니다.

아래는 Keras에서 체크포인트를 만드는 간단한 예시입니다:

from tensorflow.keras.callbacks import ModelCheckpoint

# 체크포인트를 저장할 경로 설정
checkpoint_path = "model_checkpoint.h5"

# 체크포인트 콜백 생성
checkpoint_callback = ModelCheckpoint(filepath=checkpoint_path,
                                      save_best_only=True,
                                      save_weights_only=True,
                                      monitor='val_loss',
                                      mode='min',
                                      verbose=1)

위 예제에서 filepath 매개변수는 체크포인트 파일의 저장 경로를 설정합니다. save_best_only=True로 설정하여 최상의 성능을 갖는 체크포인트만 저장합니다. 모델의 가중치만 저장하기 위해 save_weights_only=True로 설정되어 있습니다. 마지막으로, monitormode 매개변수를 사용하여 체크포인트를 저장할 지표와 방향성을 설정할 수 있습니다.

체크포인트 로드하기

체크포인트를 저장했다면, 이를 다시 로드하여 모델의 학습을 재개할 수 있습니다. 이를 위해 load_weights 메서드를 사용합니다.

아래는 체크포인트를 로드하는 예시입니다:

from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Dense

# 새로운 모델 만들기
model = Sequential()
model.add(Dense(64, activation='relu', input_dim=100))
model.add(Dense(64, activation='relu'))
model.add(Dense(1, activation='sigmoid'))

# 체크포인트 파일 로드
model.load_weights(checkpoint_path)

위 예제에서는 Sequential 모델을 만들고, 이전에 저장한 체크포인트 파일을 load_weights 메서드로 로드하여 모델에 적용합니다.

모델 학습 중간 체크포인트 저장 및 로드하기

실제로 모델의 학습 중간에도 체크포인트를 저장하고, 이를 로드하여 학습을 재개할 수 있습니다. 이를 위해서는 fit 메서드에서 callbacks 매개변수를 설정하여 체크포인트 콜백을 전달해야 합니다.

아래는 모델 학습 중간에 체크포인트를 저장하고 로드하는 예시입니다:

from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Dense
from tensorflow.keras.callbacks import ModelCheckpoint

# 새로운 모델 만들기
model = Sequential()
model.add(Dense(64, activation='relu', input_dim=100))
model.add(Dense(64, activation='relu'))
model.add(Dense(1, activation='sigmoid'))

# 체크포인트를 저장할 경로 설정
checkpoint_path = "model_checkpoint.h5"

# 체크포인트 콜백 생성
checkpoint_callback = ModelCheckpoint(filepath=checkpoint_path,
                                      save_best_only=True,
                                      save_weights_only=True,
                                      monitor='val_loss',
                                      mode='min',
                                      verbose=1)

# 모델 학습 중 체크포인트 저장
model.fit(x_train, y_train,
          epochs=10,
          validation_data=(x_val, y_val),
          callbacks=[checkpoint_callback])

# 학습 중간 체크포인트 로드
model.load_weights(checkpoint_path)

위 예제에서는 fit 메서드에서 callbacks 매개변수로 checkpoint_callback을 전달하여 체크포인트를 저장합니다. 이후, load_weights 메서드로 학습 중간 체크포인트를 로드하여 모델을 복구합니다.

마무리

Keras의 체크포인트 기능을 사용하면 예기치 않은 문제로 인해 모델을 처음부터 다시 학습할 필요 없이 중단한 시점부터 학습을 재개할 수 있습니다. 이는 시간과 컴퓨팅 자원을 절약하는 데 도움이 됩니다. 모델의 학습 과정에서 체크포인트를 적절하게 저장하고 로드하는 것은 신뢰성 높은 모델 학습에 핵심적인 요소입니다.