【问题标题】:Keras save_weights and ModelCheckpoint DifferenceKeras save_weights 和 ModelCheckpoint 的区别
【发布时间】:2020-06-15 06:30:58
【问题描述】:

我通过两种方式保存 keras 模型 1.“模型检查点” 2.训练模型后的“save_weights”

但是当使用“load_weights”和“predict”加载训练模型时,这两者的性能是不同的

我的代码如下

训练和保存模型

model_checkpoint = ModelCheckpoint("Model_weights.hdf5", verbose=1, save_best_only=True)

early_stopping = EarlyStopping(monitor='val_loss', patience=20, verbose=1, restore_best_weights=True)

hist = Model.fit(x=train_dict, y=train_label, 
                       batch_size=batch_size, epochs=epochs, 
                       validation_data=(valid_dict, valid_label),
                       callbacks=[csv_logger, early_stopping, model_checkpoint])

Model.save_weights("Model_weights.h5")

加载经过训练的模型并进行测试

Model = create_model() # Construct model skeleton 

hdf5_model = load_model("Model_weights.hdf5")

h5_model = load_model("Model_weights.h5")

“hdf5_model.predict(train)”和“h5_model.predict(train)”有区别

【问题讨论】:

    标签: python keras


    【解决方案1】:

    首先,您需要了解 ModelCheckpoint 的实际作用。它只节省最好的重量。您可以在训练期间查看每个 epoch 的损失和准确性。它在每个时代都发生变化。随着模型不断更新其权重,它有时会增加,有时会减少。

    让我们假设一种情况。你正在训练你的模型 50 个 epoch。您可能会在第 45 个 epoch 获得 loss = 0.25,在第 50 个 epoch 获得 loss = 0.37。这很正常。 ModelCheckpoint 只会节省第 45 个 epoch 的权重。它不会在第 50 个 epoch 更新。 ModelCheckpoint 仅在 loss 减少时才保存权重(您也可以通过参数更改逻辑)。但是如果你在训练完成后保存权重,它会以损失 0.37 更高的方式保存。

    通过ModelCheckpoint保存的模型损失值较低而最终模型的损失值较高是很正常的。这就是为什么您会从这两个模型中得到不同的预测。

    如果您看一下下面的图表,您可以看到在第 98 个 epoch 达到了最佳损失值。因此,您的 ModelCheckpoint 在第 98 个 epoch 保存权重并且从不更新它。

    【讨论】:

    • 感谢您的友好回答。根据您的描述,除了最后一个 epoch 提供最佳性能外,ModelCheckpoint 将保存 epoch 之间的最佳性能。那么,save_weights 保存什么呢?因为我也使用了带有 restore_best_weights=True 的 EarlyStopping,但是与 ModelCheckpoint 相比,Model.save_weights 的损失更大。为什么...? (我编辑我的问题代码)
    • 那么最终的 save_weights 在它完成训练后总是保存最后一个 epochs 的权重。但是正如您所说,您使用了 restore_best_weights=True,它应该恢复所有时期中的最佳权重。但是您缺少一个参数,请尝试为 ModelCheckpoint 设置参数“监视器”。还要添加“模式”参数以确保安全。如果您要恢复最佳权重,我认为使用 ModelCheckpoint 毫无意义,因为您只使用 ModelCheckpoint 保存最佳权重。不过,您可以使用 ModelCheckpoint 保存每个最佳权重。但这不是问题。请尝试添加缺少的参数并再次比较。
    • 谢谢。您的建议是将参数 {monitor='val_loss', mode='auto'} 以及 {save_best_only=True} 添加到 ModelCheckpoint。并通过 ModelCheckpoint 使用保存的模型。因为 save_weights 只保存最后一个 epoch,所以它不能确保最佳性能权重。
    • 是的。但是,如果您使用 restore_best = true 的提前停止,并且您只需要损失最小的模型,则不需要使用 modelcheckpoint。有时,您的全局最小值可能会在以后被发现。我的建议是:如果您仍然对准确性不满意,请降低 LR,设置更高的 epoch 数并且不要使用提前停止。仅使用 CheckPoint 来保存权重。然后您可以比较所有检查点并决定使用哪一个。
    猜你喜欢
    • 1970-01-01
    • 2016-08-20
    • 1970-01-01
    • 2017-07-26
    • 1970-01-01
    • 2018-05-05
    • 1970-01-01
    • 2019-03-31
    • 1970-01-01
    相关资源
    最近更新 更多