머신러닝&딥러닝

학습시키는 중에 모델 업데이트하기 / 딥러닝, 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