model.fit()是否会在每轮epoch后重置指标?如何手动重置训练指标?
解决方案
你不需要自行循环调用model.fit(),通过自定义Keras回调的方式就可以实现每个epoch后重置指标,且完全不影响ModelCheckpoint、CSVLogger等内置回调的正常工作。
步骤1:定义自定义重置指标回调
import tensorflow as tf class ResetMetricsPerEpoch(tf.keras.callbacks.Callback): def on_epoch_end(self, epoch, logs=None): # 遍历模型绑定的所有指标,执行状态重置 for metric in self.model.metrics: metric.reset_states()
步骤2:把回调加入你的回调列表即可
在你现有定义callbacks的代码中,新增实例化后的自定义回调:
callbacks = [ tf.keras.callbacks.ReduceLROnPlateau(monitor='val_loss', patience=REDUCE_LR_PATIENCE, verbose=1, factor=REDUCE_LR_FACTOR), tf.keras.callbacks.EarlyStopping(monitor='val_loss', verbose=1, patience=EARLY_STOPPING_PATIENCE), tf.keras.callbacks.ModelCheckpoint(filepath=modelName + '_epoch-{epoch:02d}.h5', monitor='val_loss', save_best_only=False, verbose=1), tf.keras.callbacks.CSVLogger(modelName + '_training.csv'), # 新增重置指标的回调 ResetMetricsPerEpoch() ]
补充说明
- 你用到的AUC、分类准确率、tfa的F1Score都继承自Keras基础指标类,通用支持
reset_states()方法,无需额外适配。 - 如果你确实需要采用自行循环调用
model.fit()的方案,也可以通过指定model.fit()的initial_epoch参数保证回调拿到的epoch编号正确:每次循环调用时把epochs设为当前要训练的轮次+1,initial_epoch设为当前已经训练完成的轮次,即可解决编号错乱的问题,不过该方案改动量远大于回调方案,没有特殊需求不推荐使用。
内容的提问来源于stack exchange,提问作者ztsv-av
相关产品推荐
相关产品推荐

