Keras的EarlyStopping是否保存最佳模型?

时间:2018-08-15 11:28:21

标签: python machine-learning keras

使用类似的东西时:

callbacks = [
    EarlyStopping(patience=15, monitor='val_loss', min_delta=0, mode='min'),
    ModelCheckpoint('best-weights.h5', monitor='val_loss', save_best_only=True, save_weights_only=True)
]

model.fit(..., callbacks=callbacks)

y_pred = model.predict(x_test)

我是使用训练期间计算出的最佳权重进行预测还是使用model使用最后的权重(可能不是最佳权重)?

因此,上述方法是安全的方法还是应该将best-weights.h5加载到模型中,即使在训练后立即进行了预测?

3 个答案:

答案 0 :(得分:1)

我会说model使用最新的权重,但是我在文档中找不到任何证据。 幸运的是,您可以自己检查model的行为。

首先运行:

y_pred = model.predict(x_test)

之后,您可以加载best-weights.h5并再次在同一测试集上运行预测。

如果model包含最新的权重,则在加载best-weights.h5时应该会得到更好的结果。如果结果相同,则可以确保模型自动使用最佳结果。

答案 1 :(得分:1)

EarlyStopping回调本身不会保存任何内容(您可以查看其源代码https://github.com/keras-team/keras/blob/master/keras/callbacks.py#L458对其进行仔细检查)。因此,您的代码保存了在通过早期停止回调停止训练之前在开发集上获得最佳结果的最后一个模型。 我想说的是,如果您仅根据开发人员保存最佳模型,那么还有一个提前停止的回调是没有用的(除非您不想节省时间,并且您肯定不会找到任何方法)如果您继续训练,将会获得更好的模型)

答案 2 :(得分:1)

训练通过def countWordOccourence(words: Array[String]): Array[(String, Int)] = { val sortedArray = words.sorted var tupleArray: Array[(String, Int)] = Array() var currentCount: Int = 1 for (i: Int <- 0 to (sortedArray.length - 1)) { if (i + 1 < sortedArray.length) { // prevent out of bound access if (sortedArray(i) == sortedArray(i+1)) { // same words should be next to each other currentCount += 1 } else{ // End of sorted elements , put elements in a tuple tupleArray = tupleArray ++ Array((sortedArray(i), currentCount)) currentCount = 1 // reset the counter } }else { // Just in case there is a last element if (sortedArray(i) != sortedArray(i -1)) { tupleArray = tupleArray ++ Array((sortedArray(i), 1)) } } } return tupleArray } 回调停止后,当前模型可能不是监视数量最高/最低的最佳模型。因此,如果您想恢复最佳权重,则Keras 2.2.3发行版的EarlyStopping回调中引入了新的参数EarlyStopping

  

restore_best_weights :是否从纪元恢复具有最佳监视数量值的模型权重。如果restore_best_weights,则   使用训练的最后一步获得的模型权重。