Keras ModelCheckpoint 是否会在多个拟合会话中保存最佳模型?

Does Keras ModelCheckpoint save the best model across multiple fitting sessions?

如果我有一个装有 ModelCheckpoint 回调的 Keras 模型并将其放入几个 'fitting sessions' 中(即我多次调用 model.fit()),回调会保存最佳模型吗在最近的试衣环节中还是所有试衣环节中最好的模特?

谢谢。

会保存最近一次试衣的最佳模型

它将保存最后一个 fit() 的模型,因为您实际上是在覆盖同一个文件。

如果您想在 N 次迭代中找到最佳模型,您应该在文件名中使用前缀 N 来保存它们。这样它将保存特定 fit() 的最佳模型,您以后可以轻松地比较它们。您可以手动添加 N,即每个 fit().

1,2,3,N
// Example
ModelCheckpoint(
        '/home/jupyter/checkpoint/best_model_{N}.h5',
        monitor="val_loss",
        save_best_only=True,
        save_weights_only=False,
        mode="min")

好问题。我用现有的模型和数据集做了一个实验。如图所示,我创建了一个检查点回调并在 model.fit

中使用了它
file_path1=r'c:\temp\file1'
mchk=tf.keras.callbacks.ModelCheckpoint( filepath=file_path1,  monitor="val_loss", verbose=1,
    save_best_only=True, save_weights_only=True, mode="auto", save_freq="epoch" )

history = model.fit(X_train, Y_train, validation_data=val_data,
                     batch_size= 128, epochs= 5,  verbose= 1, callbacks=[mchk])

我只保存了权重,并且只保存了验证损失最低的 epoch 的权重。我在回调中设置了 verbose=1,这样我就可以看到每个时期的验证损失值。接下来我再次 运行 基本上相同的代码,但我改变了 file2 的文件路径的名称。代码如下

file_path2=r'c:\temp\file2'
mchk=tf.keras.callbacks.ModelCheckpoint( filepath=file_path2,  monitor="val_loss", verbose=1,
    save_best_only=True, save_weights_only=True, mode="auto", save_freq="epoch" )

history = model.fit(X_train, Y_train, validation_data=val_data,
                     batch_size= 128, epochs= 5,  verbose= 1, callbacks=[mchk])

现在 model.fit 会在会话结束时保留其状态,因此如果您 运行 第二次使用它 它从停止的地方开始。但是它不保留回调的状态。 所以在第二个 运行 回调将验证损失初始化为 np.inf 所以它会 确保在第一个纪元结束时保存权重。如果您不更改文件名,它将覆盖由于第一个 运行 而保存的文件。如果在第二个 运行 中保存权重的验证损失值低于第一个 运行 的验证损失值,那么您将获得总体上保存的最佳权重。但是,如果在第二个 运行 中,验证损失比第一个 运行 中的要高,你最终不会保存总体最佳权重。这就是回调具有 save_weights_only=True 的情况的工作原理。我认为如果您保存整个模型,它的行为可能会有所不同,因为在这种情况下它可能会保留回调的状态。所以我重新运行实验save_weights_only=False。结果表明保存整个模型不会保存回调的状态。现在我正在使用 Tensorflow 2.0。不同版本的结果可能不同。我会 运行 在你的版本上做这个实验,看看它的行为是否相似。

是的,只有当性能优于对 fitall 次调用时,才会保存检查点。换句话说,如果最近一次调用 fit 中的 none 个纪元比之前调用 fit 中的一个纪元具有更好的性能,则不会覆盖先前的检查点。

有一个附带条件:您必须记住在 fit 调用之外创建回调。也就是说,这样做:

checkpoint_callback = keras.callbacks.ModelCheckpoint(
    "checkpoint.h5", save_best_only=True)

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

不是这个:

model.fit(..., callbacks=keras.callbacks.ModelCheckpoint(
                   "checkpoint.h5", save_best_only=True))
...
model.fit(..., callbacks=keras.callbacks.ModelCheckpoint(
                   "checkpoint.h5", save_best_only=True))

检查点回调对象有一个 best 属性,它存储迄今为止最好的监控值(并且最初设置为可能的最差值,例如 infinity 如果越低越好)。当对象传递给 fit 时,这不会重置。然而,如果你在对 fit 的调用中实例化一个新的回调对象,就像在后面的代码中一样,自然地 best 将被初始化为可能的最差值,而不是其他回调对象存储的最佳监控值在之前对 fit.

的调用中