在Keras中使用交叉验证的指标提前停止

时间:2018-10-13 01:01:53

标签: python keras prediction cross-validation

Keras中是否有一种方法可以交叉验证正在监视的EarlyStopping(monitor = 'val_acc', patience = 5)的早期停止指标?在允许训练进行到下一个时期之前,可以对模型进行交叉验证以获得对测试误差的更可靠估计吗?我发现,早期停止指标(例如验证集的准确性)可能会出现较大差异。早期停止的模型通常在看不见的数据上表现不佳,我怀疑这是因为与验证集方法相关的差异很大。

为了最小化早期停止指标的差异,我想对模型从历元i到历元i + 1进行训练时,对早期终止指标进行k折交叉验证。我想在时代i进行建模,将训练数据分成10个部分,学习9个部分,估计其余部分的误差,然后重复,以便所有10个部分都有机会进行验证设置,然后像往常一样使用完整的训练数据进行训练以使i + 1达到新纪元。希望将这10个错误估计的平均值作为一个更可靠的指标,可以用于提前停止。

我尝试编写一个自定义指标函数,该函数包含k倍交叉验证,但无法正常工作。是否可以通过Keras模型内部的自定义函数或Keras模型外部的循环交叉验证所监视的早期停止指标?

谢谢!

2 个答案:

答案 0 :(得分:2)

Keras确实具有可定制的回调功能,可以看出 here

如果您对keras当前的EarlyStopping函数不满意,该函数对我来说是训练期间检查验证损失的工作,则可以创建一个自定义的回调函数。自定义回调函数也可以链接。

如果您的问题是在回调内部访问模型,那么self是您要访问的变量,如在此answer中所见。我不完全理解为什么要在测试阶段“重新开发”模型。但是这样,您仍然可以使用回调,在EarlyStopping回调之后,您可以创建另一个可以“重新开发”模型的回调函数。

如果要访问模型,可以使用更深的变量Keras backend

希望我能帮上忙。

答案 1 :(得分:0)

我想象使用@VincentPakson建议的回调将更干净,更高效,但是所需的编程水平超出了我。我能够创建一个for循环来执行我想要的操作:

  1. 为单个时期训练模型并使用model.save()保存。

  2. 加载保存的模型并针对10折中的每一个折叠训练模型(即10个模型),然后平均10个验证集错误。

  3. 使用所有训练数据加载保存的模型并针对单个时期进行训练,并使用该模型覆盖保存的模型。

  4. 重复步骤1-3,直到对于给定的耐心,来自2的估计值停止改善。

我希望有一个更好的答案,但这似乎可行。慢慢地。