首页 > 解决方案 > Keras save_weights 和 ModelCheckpoint 的区别

问题描述

我通过两种方式保存keras模型 1.“ModelCheckpoint” 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)”之间有区别

标签: pythonkeras

解决方案


首先,您需要了解 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 保存权重并且从不更新它。

在此处输入图像描述


推荐阅读