머신러닝&딥러닝
학습시키는 중에 모델 업데이트하기 / 딥러닝, TensorFlow, Callback, ModelCheckPoint
LearnerToRunner
2022. 12. 5. 20:09
목표
학습 중 모델 업데이트하기
코드예제
tensorflow.keras.callbacks import ModelCheckPoint
# 모델 생성/컴파일 부분은 주석처리하겠음
"""
# 모델 생성
model = Sequential()
model.add(Dense(50, input_dim=8, activation='relu')) # 500개의 노드 생성, input feature가 8개, 활성화 함수는 relu로 사용
model.add(Dense(10, activation= 'relu'))
model.add(Dense(1, activation= 'sigmoid'))
# 컴파일
params = {'optimizer':'adam', 'lr': 0.1,'loss': 'binary_crossentropy', 'metrics':['accuracy'], 'epoch': 1000, 'batch_size':10, 'validation_split': 0.3}
model.compile(loss=params['loss'], optimizer=params['optimizer'], metrics=params['metrics'])
model.summary()
"""
# 모델 저장 위치 및 이름셋업
MODEL_DIR = './models/' # 모델 저장위치
if not os.path.exists(MODEL_DIR): # 위치가 없으면
os.mkdir(MODEL_DIR) # 만들어줘
model_name = MODEL_DIR+'{epoch:02d}-{val_loss:.4f}.hdf5' #모델 이름은 에포크-val_loss로
# 체크포인트
check_pointer = ModelCheckpoint(filepath=model_name, monitor='val_loss', verbose=1, save_best_only=True)
# 학습(fit)에 모델체크포인트 적용 (리스트 형태로)
model.fit(x_prcd, y, epochs=params['epoch'], batch_size=params['batch_size'], validation_split=params['validation_split'], callbacks=[check_pointer])
설명
MultiCheckPoint()
모델 또는 웨이트를 특정 주기에 따라 저장
monitor =
무슨 지표를 관찰할까?
ex. val_loss, loss, val_accuracy, accuracy
verbose =
액션을 취할 때 (모델을 저장) 메시지로 알려줄까?
0: 높!
1: 예압!
save_best_only =
이전보다 지표가 개선되었을 때만 저장할까?
Ture or False
save_freq =
얼마의 에포크 간격으로 저장해줄까?
check_pointer = ModelCheckpoint(filepath=model_name, # 모델위치/이름
monitor='val_loss', # valid_loss를 관찰
verbose=1, #모델 저장시 메시지로 알려줘
save_best_only=True # val_loss가 나아졌을 때만 저장해줘
)
확인해보기
아래는 실행할 코드입니다
"""
모델 생성, 컴파일 부분 생략
"""
# 모델 저장 위치 및 이름
MODEL_DIR = './models/' #모델 저장할 위치
if not os.path.exists(MODEL_DIR): # 해당 위치가 없으면
os.mkdir(MODEL_DIR) # 만들어줘
model_name = MODEL_DIR+'{epoch:02d}-{val_loss:.4f}.hdf5' # 모델이름 양식
# 모델체크포인트
check_pointer = ModelCheckpoint(filepath=model_name, monitor='val_loss', verbose=1, save_best_only=True)
# 학습
model.fit(x_prcd, y, epochs=params['epoch'], batch_size=params['batch_size'], validation_split=params['validation_split'], callbacks=[check_pointer])
아래는 실행결과입니다.
verbose = 1 로 설정해두었기 때문에
각 에포크 별로 loss가 개선되었는지 알려주는 메시지와 함께
모델이 저장되었을 때는 파일명을 출력해주는 것을
확인할 수 있습니다
Epoch 00001: val_loss improved from inf to 0.61084, saving model to ./models\01-0.6108.hdf5
Epoch 2/1000
54/54 [==============================] - 0s 7ms/step - loss: 0.5779 - accuracy: 0.6685 - val_loss: 0.5420 - val_accuracy: 0.7056
Epoch 00002: val_loss improved from 0.61084 to 0.54196, saving model to ./models\02-0.5420.hdf5
Epoch 3/1000
54/54 [==============================] - 0s 7ms/step - loss: 0.5355 - accuracy: 0.7281 - val_loss: 0.5033 - val_accuracy: 0.7403
Epoch 00003: val_loss improved from 0.54196 to 0.50333, saving model to ./models\03-0.5033.hdf5
Epoch 4/1000
54/54 [==============================] - 0s 7ms/step - loss: 0.5125 - accuracy: 0.7561 - val_loss: 0.4791 - val_accuracy: 0.7706
Epoch 00004: val_loss improved from 0.50333 to 0.47911, saving model to ./models\04-0.4791.hdf5
Epoch 5/1000
54/54 [==============================] - 0s 7ms/step - loss: 0.4964 - accuracy: 0.7654 - val_loss: 0.4596 - val_accuracy: 0.7965
"""
중략
"""
Epoch 00060: val_loss did not improve from 0.42363
Epoch 61/1000
54/54 [==============================] - 0s 7ms/step - loss: 0.3491 - accuracy: 0.8417 - val_loss: 0.4459 - val_accuracy: 0.7835
Epoch 00061: val_loss did not improve from 0.42363
Epoch 62/1000
54/54 [==============================] - 0s 8ms/step - loss: 0.3459 - accuracy: 0.8473 - val_loss: 0.4482 - val_accuracy: 0.7879
Epoch 00062: val_loss did not improve from 0.42363
Epoch 63/1000
54/54 [==============================] - 0s 7ms/step - loss: 0.3460 - accuracy: 0.8492 - val_loss: 0.4478 - val_accuracy: 0.7879
Epoch 00063: val_loss did not improve from 0.42363
TensorFlow Documentation - tf.keras.callbacks.ModelCheckpoint
728x90