Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/tensorflow/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Tensorflow Keras ModelCheckpoint是否跨多个装配会话保存最佳模型?_Tensorflow_Keras_Deep Learning_Data Science - Fatal编程技术网

Tensorflow Keras ModelCheckpoint是否跨多个装配会话保存最佳模型?

Tensorflow Keras ModelCheckpoint是否跨多个装配会话保存最佳模型?,tensorflow,keras,deep-learning,data-science,Tensorflow,Keras,Deep Learning,Data Science,如果我的Keras模型安装了ModelCheckpoint回调,并将其安装在多个“安装会话”(即,我多次调用model.fit()),回调会保存最近安装会话中的最佳模型还是所有安装会话中的最佳模型 谢谢。它将在最近的安装会话中保存最佳模型它将在最后一次fit()中保存模型,因为您实际上是在覆盖同一文件 如果您想在N迭代中找到最佳模型,您应该在文件名中使用前缀N保存它们。这样,它将为特定的fit()保存最佳模型,以后您可以轻松地对它们进行比较。您可以手动为每个fit()添加N,即1,2,3,N 好

如果我的Keras模型安装了
ModelCheckpoint
回调,并将其安装在多个“安装会话”(即,我多次调用
model.fit()
),回调会保存最近安装会话中的最佳模型还是所有安装会话中的最佳模型


谢谢。

它将在最近的安装会话中保存最佳模型

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

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


好问题。我用现有的模型和数据集做了一个实验。我创建了一个检查点回调,如图所示,并在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,以便可以看到每个历元上的验证丢失值。接下来,我再次运行了基本相同的代码,但我改变了 文件2的文件路径的名称。代码如下

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。不同版本的结果可能不同。我将在您的版本上运行此实验,看看它是否表现出类似的行为。

是的,只有当性能优于对
fit
的所有调用时,才会保存检查点。换句话说,如果最近一次调用
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

时存储的最佳监控值。请尝试添加一些您尝试过的片段。不正确,只有在所有拟合会话中都是最佳的情况下,它才会保存模型,只要您只创建一个回调对象(在调用
fit
之外)。
// Example
ModelCheckpoint(
        '/home/jupyter/checkpoint/best_model_{N}.h5',
        monitor="val_loss",
        save_best_only=True,
        save_weights_only=False,
        mode="min")