python - 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)”之间有区别
解决方案
首先,您需要了解 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 保存权重并且从不更新它。
推荐阅读
- java - java.lang.NoSuchMethodError:com.google.api.client.http.javanet.NetHttpTransport。
(Lcom/google/api/client/http/javanet/ConnectionFactory; - reactjs - 国际化反应应用。如何提取消息?
- c# - 验证 POST 请求的输入?
- google-chrome - Flutter web 包含自动完成功能
- python-3.x - 将单调度与自定义类一起使用(CPython 3.8.2)
- api - MWS 开发人员对 PII 个人身份信息的访问权限被撤销 - 买家姓名、电话、地址变为空白
- ios - iOS弹出菜单(android工具栏菜单模拟)
- reactjs - UseEffect 不返回响应 onMount
- python - 网络爬虫入门
- c++ - std::filesystem 试图调用图像文件