【发布时间】:2020-12-23 03:44:10
【问题描述】:
如果我有一个装有 ModelCheckpoint 回调的 Keras 模型并将其拟合到多个“拟合会话”中(即我多次调用 model.fit()),回调是否会在最近的拟合会话中保存最佳模型或所有试衣过程中最好的模特?
谢谢。
【问题讨论】:
-
请尝试添加一些您尝试过的sn-ps
标签: tensorflow keras deep-learning data-science
如果我有一个装有 ModelCheckpoint 回调的 Keras 模型并将其拟合到多个“拟合会话”中(即我多次调用 model.fit()),回调是否会在最近的拟合会话中保存最佳模型或所有试衣过程中最好的模特?
谢谢。
【问题讨论】:
标签: tensorflow keras deep-learning data-science
好问题。我用现有的模型和数据集做了一个实验。我创建了一个如图所示的检查点回调并在 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])
我只保存了权重,只保存了验证损失最低的时期的权重。我在回调中设置了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 所以它将 确定在第一个 epoch 结束时保存权重。如果您不更改文件的名称,它将覆盖您由于第一次运行而保存的文件。如果在第二次运行中保存权重的验证损失的值低于第一次运行的验证损失,那么您最终会获得总体上最好的保存权重。但是,如果在第二次运行中验证损失高于第一次运行,您最终不会保存 OVERALL 最佳权重。这就是回调具有 save_weights_only=True 的情况。我认为如果您保存整个模型,它的行为可能会有所不同,因为在这种情况下它可能会保留回调的状态。所以我用 save_weights_only=False 重新进行了实验。结果表明保存整个模型不会保存回调的状态。现在我正在使用 TensorFlow 2.0。不同版本的结果可能不同。我会在你的版本上运行这个实验,看看它的行为是否相似。
【讨论】:
它将在最近的拟合会话中保存最佳模型
【讨论】:
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")
【讨论】:
是的,只有当性能优于对fit 的所有 次调用时,才会保存检查点。换句话说,如果您最近一次调用 fit 的 epoch 没有比之前调用 fit 的 epoch 有更好的性能,那么之前的检查点不会被覆盖。
有一个附带条件:您必须记住在调用之外创建回调以适应。也就是说,这样做:
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.
【讨论】: