【问题标题】:Does model.fit() reset metrics after each epoch? How to reset metrics manually?model.fit() 是否在每个 epoch 后重置指标?如何手动重置指标?
【发布时间】:2021-06-25 03:22:27
【问题描述】:

据我了解,model.fit(epochs=NUM_EPOCHS) 不会重置每个时期的指标。我的 metrics 和 model.fit() 代码如下所示(简化):

import tensorflow as tf
from tensorflow.keras import applications

NUM_CLASSES = 4
INPUT_SHAPE = (256, 256, 3)
MODELS = {
    'DenseNet121': applications.DenseNet121,
    'DenseNet169': applications.DenseNet169
}
REDUCE_LR_PATIENCE = 2
REDUCE_LR_FACTOR = 0.7
EARLY_STOPPING_PATIENCE = 4


for modelName, model in MODELS.items():

    loadedModel = model(include_top=False, weights='imagenet',
                        pooling='avg', input_shape=INPUT_SHAPE)

    sequentialModel = tf.keras.models.Sequential()
    sequentialModel.add(loadedModel)
    sequentialModel.add(tf.keras.layers.Dense(NUM_CLASSES, activation='softmax'))

    aucCurve = tf.keras.metrics.AUC(curve = 'ROC', multi_label = True)
    categoricalAccuracy = tf.keras.metrics.CategoricalAccuracy()
    F1Score  = tfa.metrics.F1Score(num_classes = NUM_CLASSES, average = 'macro', threshold = None)
    metrics = [aucCurve, categoricalAccuracy, F1Score]

    sequentialModel.compile(metrics=metrics)

    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')]

    sequentialModel.fit(epochs=NUM_EPOCHS)

也许我可以通过在 NUM_EPOCHS 范围内执行 for 循环来重置指标,并在 for 循环中初始化指标,但我不确定这是否是一个好的解决方案。另外,我有 ModelCheckpoint 和 CSVLogger 回调,它们需要来自 model.fit() 的纪元数,所以如果我执行 for 循环,它就不会真正起作用。

您对如何重置每个时期的指标有什么建议吗?在 NUM_EPOCHS 范围内执行 for 循环是这里唯一的解决方案吗?谢谢。

【问题讨论】:

    标签: python machine-learning keras metrics


    【解决方案1】:

    不,指标是按时期计算的。它们不是每个时期的平均值,而是每个时期的批次平均值。您会看到指标不断改进,因为您的模型正在接受训练。

    【讨论】:

    • 感谢您的快速回复!你能解释一下为什么当模型开始训练时,它的度量值(例如准确度)在第一个时期开始和第一批结束时大约是 0.5,而在训练结束时(即最后一个时期)的值约为 0.9。然后,当第二个 epoch 开始并且第一批结束时,指标的值再次在 0.9 左右,然后该值可能会下降或上升。那么,为什么在第二个 epoch 开始时指标的值不再是 0.5 左右?
    • 这是否意味着模型权重从第一个 epoch 开始就已经训练得很好,在第二个 epoch 开始时他们的预测比第一个 epoch 好得多,并且指标的值每批都减少因为它看到更多的数据并错误地预测了一些标签,但随后稳定了?
    • Then, when the second epoch begins and the first batch ends, the metric's value is again around 0.9, then the value might go down or up. 这是因为你的模型正在接受训练
    • 说你的最后一个 epochs acc 是 0.9,当前 epoch 将进一步改进模型,因此它的 acc 将从 0.9 进一步提高,所以它继续用于训练数据。对于测试数据,它会根据是否过拟合而有所不同。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-11-16
    • 2018-08-10
    • 2017-04-09
    • 2021-07-29
    • 1970-01-01
    • 2022-07-25
    • 1970-01-01
    相关资源
    最近更新 更多