最近想到一個需求
就是如何使用 keras 的自定義ModelCheckpoint儲存loss與val_loss最高的最佳權重?
意思就是當loss 為0.5,val_loss為0.6時,我要視當下這權重的best loss為0.6
就是取高的
因為有些情況下
val_loss在訓練初期會很低
但是實際上train loss還很高
也就是val_loss的低只是單純猜的
因為驗證資料本身比較少
猜對機率較高
所以會產生這種奇怪問題
所以我想要寫一個自定義ModelCheckpoint來解決這問題
也就是儲存權重依據的loss或是acc都是依據train與val目前較差的那一個
這樣才能確保權重對於train與val都有效
然後特別的是
其實我一開始沒有什麼頭緒
所以我就把我的需求打給 chatGPT
沒想到她還真的給我一個函式來測試
雖然是有BUG的
但是我看得懂架構我就可以修改了
而且還真的可以運行
以下是範例程式碼
from tensorflow.keras.callbacks import Callback
class CustomModelCheckpoint(Callback):
def __init__(self, model, filepath, monitors=['loss', 'val_loss'],
verbose=1,save_weights_only=False,
mode='min'):
super(CustomModelCheckpoint, self).__init__()
self.filepath = filepath
self.verbose = verbose
self.save_weights_only = save_weights_only
self.best_weights = None
self.mode = mode
self.model = model
self.monitors = monitors
if self.mode == 'min':
self.best_t_loss = np.Inf
else:
self.best_t_loss = -np.Inf
def on_epoch_end(self, epoch, logs=None):
logs = logs or {}
if self.mode == 'min':
now_Best_loss = -np.Inf
else:
now_Best_loss = np.Inf
for monitor in self.monitors:
if self.mode == 'min':
if logs.get(monitor) is not None and logs[monitor] > now_Best_loss:
now_Best_loss = logs[monitor]
else:
if logs.get(monitor) is not None and logs[monitor] < now_Best_loss:
now_Best_loss = logs[monitor]
self.best_weights = None
if (self.mode == 'min' and now_Best_loss < self.best_t_loss) or \
(self.mode == 'max' and now_Best_loss > self.best_t_loss):
if self.verbose > 0:
print(' best weights improved from %0.5f to %0.5f,'
' saving model to %s' % (self.best_t_loss, now_Best_loss, filepath))
self.best_t_loss = now_Best_loss
self.model.save_weights(filepath, overwrite=True)
使用方式則是加入callbacks就可以
saveBestF = CustomModelCheckpoint(net_final,
monitors=['accuracy', 'val_accuracy'],
filepath=filepath,
verbose=1,
mode='max',
)
callbacks_list = [saveBestF]
history = net_final.fit(
x=train_generator_C,
validation_data=val_generator_C,
epochs=NUM_EPOCHS,
callbacks=callbacks_list,
verbose=1,
)
給大家參考囉
同時也感嘆chatGPT的神奇
難道我也要被chatGPT取代了嗎?![]()

留言板
歡迎留下建議與分享!希望一起交流!感恩!