【问题标题】:Difference between validation accuracy and results from model.evaluate验证准确度与模型结果之间的差异。评估
【发布时间】:2021-04-21 15:59:58
【问题描述】:

我是深度学习的新手,我不知道在每个 epoch 结束时获得的 验证准确度准确度 之间有什么区别> 您可以使用model.evaluate() 方法获得。例如:

model.fit(train_dataset, validation_data=test_dataset, epochs=1)

model.fit(train_dataset, epochs=1)
loss, scores = model.evaluate(test_dataset)

这两个脚本会返回相同的精度吗?

【问题讨论】:

    标签: tensorflow machine-learning keras deep-learning


    【解决方案1】:

    是的,两者的返回值相同,但是它们用于不同的目的。

    通常你不会evaluate 验证集。相反,您将评估另一组 test_set,但在您的情况下,您似乎只有一个 train 和一个 test_dataset,因此这两种方法(.fit 中方法的最后一个时期)将输出相同的精度。

    validation_data 参数用于输出准确度/损失指标在模型训练时,让您了解模型如何随着时间的推移对未调整数据的数据进行学习模型权重,即“看不见的”数据。

    但是,鉴于您查看了这些结果,并调整您的模型以尝试获得最佳的验证准确度/损失,您已经引入了一定程度的偏差,因此您可能会对模型的表现产生过度乐观的印象在真正看不见的数据上 - 考虑一下,您正在针对非常具体的验证集进行优化,因此另一个数据集可能会给出不同的结果。

    因此,保留另一组 test_dataset 是有意义的,您尚未针对它进行优化,但仍希望能够说“我的模型提供 X% 的准确度”或得到一个通用的模型如何执行的意见。这就是 model.evaluate 的用武之地,因为它是一种无需再次调用 model.fit 即可查看准确度的方法。

    【讨论】:

    • 感谢您的解释!我还有一个疑问:验证数据集对最终模型有影响吗?我的意思是,如果在训练期间我不调整验证数据集上的任何超参数,模型最终会在验证数据集上具有更好的准确性吗?
    • 不,唯一真正影响模型的是训练集的损失。您可以使用任何准确度指标或根本不使用验证集,模型仍然会学习相同的内容,但问题是您如何自己解释结果并确定如何进行改进。
    【解决方案2】:

    当你这样做时

    model.fit(train_dataset, validation_data=test_dataset, epochs=3)
    

    这样,您使用train_dataset 训练模型,并使用test_dataset,在每个时期后评估您的模型。因此,在每个 epoch 之后,keras API 都会调用model. evaluate(test_dataset) 并通过以下方式为您提供训练日志:

    Epoch 1/3
    20ms/step - loss: 0.494 - accuracy: 0.8904 - val_loss: 0.6392 - val_accuracy: 0.8841
    
    Epoch 2/3
    16ms/step - loss: 0.1594 - accuracy: 0.9204 - val_loss: 0.5392 - val_accuracy: 0.9041
    
    Epoch 3/3
    17ms/step - loss: 0.0594 - accuracy: 0.9904 - val_loss: 0.2392 - val_accuracy: 0.9741
    

    但是,如果您执行以下操作,在model. fit 中没有使用test_dataset,您将只能通过以下方式获取训练日志。

    model.fit(train_dataset, epochs=1)
    
    Epoch 1/3
    20ms/step - loss: 0.494 - accuracy: 0.8904 
        
    Epoch 2/3
    16ms/step - loss: 0.1594 - accuracy: 0.9204 
    
    Epoch 3/3
    17ms/step - loss: 0.0594 - accuracy: 0.9904 
    

    在完成所有 epoch 后,当您执行以下操作时,它将一次性评估您的模型(与之前的 3 次不同),并为您提供最后的验证分数。

    loss, scores = model.evaluate(test_dataset)
    [0.2392, 0.9741]
    

    因此,当您在 model. fit 中使用 test_dataset 时,model. evaluate 将在 每个 epoch 之后使用此数据集,并为您提供每个 epoch 的验证分数,但如果您使用 @ 987654335@ 分别在model. evaluate 中,它只会计算一次。另外请注意,在最后的训练日志中,验证分数在您以后计算时是相同的。

    model.fit(..., test_dataset)
    Epoch 3/3
        17ms/step - ... val_loss: 0.2392 - val_accuracy: 0.9741
    
    ----
    
    loss, scores = model.evaluate(test_dataset)
    [0.2392, 0.9741]
    

    请参阅我的其他答案,它可能会给您更多的见解。 Splitting data to training, testing, and valuation.

    【讨论】:

    • 那么是一样还是有什么变化?
    • 不完全是。在第一种方法中,您更有可能使用 .fit 方法使用此验证集来获得一些最佳超参数。例如,您可以通过监控验证指标使用reduce_learning_rateearly_stopping 回调。
    • 否则,通常结果是一样的。
    • @jackve 看到更新的答案,希望你现在清楚了。
    猜你喜欢
    • 1970-01-01
    • 2022-08-10
    • 1970-01-01
    • 2018-11-08
    • 1970-01-01
    • 2020-07-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多