Keras中是否有一种方法可以交叉验证正在监视的EarlyStopping(monitor = 'val_acc', patience = 5)
的早期停止指标?在允许训练进行到下一个时期之前,可以对模型进行交叉验证以获得对测试误差的更可靠估计吗?我发现,早期停止指标(例如验证集的准确性)可能会出现较大差异。早期停止的模型通常在看不见的数据上表现不佳,我怀疑这是因为与验证集方法相关的差异很大。
为了最小化早期停止指标的差异,我想对模型从历元i
到历元i + 1
进行训练时,对早期终止指标进行k折交叉验证。我想在时代i
进行建模,将训练数据分成10个部分,学习9个部分,估计其余部分的误差,然后重复,以便所有10个部分都有机会进行验证设置,然后像往常一样使用完整的训练数据进行训练以使i + 1
达到新纪元。希望将这10个错误估计的平均值作为一个更可靠的指标,可以用于提前停止。
我尝试编写一个自定义指标函数,该函数包含k倍交叉验证,但无法正常工作。是否可以通过Keras模型内部的自定义函数或Keras模型外部的循环交叉验证所监视的早期停止指标?
谢谢!
答案 0 :(得分:2)
Keras确实具有可定制的回调功能,可以看出 here。
如果您对keras当前的EarlyStopping
函数不满意,该函数对我来说是训练期间检查验证损失的工作,则可以创建一个自定义的回调函数。自定义回调函数也可以链接。
如果您的问题是在回调内部访问模型,那么self
是您要访问的变量,如在此answer中所见。我不完全理解为什么要在测试阶段“重新开发”模型。但是这样,您仍然可以使用回调,在EarlyStopping
回调之后,您可以创建另一个可以“重新开发”模型的回调函数。
如果要访问模型,可以使用更深的变量Keras backend。
希望我能帮上忙。
答案 1 :(得分:0)
我想象使用@VincentPakson建议的回调将更干净,更高效,但是所需的编程水平超出了我。我能够创建一个for循环来执行我想要的操作:
为单个时期训练模型并使用model.save()
保存。
加载保存的模型并针对10折中的每一个折叠训练模型(即10个模型),然后平均10个验证集错误。
使用所有训练数据加载保存的模型并针对单个时期进行训练,并使用该模型覆盖保存的模型。
重复步骤1-3,直到对于给定的耐心,来自2的估计值停止改善。
我希望有一个更好的答案,但这似乎可行。慢慢地。