深度学习模型可能需要数小时、数天甚至数周才能训练完成。
如果训练意外中断,您可能会损失大量工作。
在本篇博文中,您将学习如何在 Keras 库中使用 Python 在训练过程中对深度学习模型进行检查点(checkpointing)。
开启您的项目,阅读我的新书《Python 深度学习》,书中包含分步教程以及所有示例的Python 源代码文件。
让我们开始吧。
- 2016 年 6 月:首次发布
- 2017 年 3 月更新:更新至 Keras 2.0.2、TensorFlow 1.0.1 和 Theano 0.9.0
- 2018年3月更新:添加了下载数据集的备用链接
- 2019 年 9 月更新:更新至 Keras 2.2.5 API
- 2019 年 10 月更新:已更新至 Keras 2.3.0 API
- 更新于 2022 年 7 月:已更新为 TensorFlow 2.x API,并提及了 EarlyStopping。

如何在 Keras 中对深度学习模型进行检查点
照片由 saragoldsmith 提供,部分权利保留。
检查点神经网络模型
应用程序检查点是一种用于长时间运行进程的容错技术。
在这种方法中,会捕获系统状态的快照,以防系统发生故障。如果出现问题,并非所有东西都会丢失。检查点可以直接使用,也可以作为新运行的起点,从中恢复。
在训练深度学习模型时,检查点保存在模型的权重中。这些权重可用于直接进行预测,或作为继续训练的基础。
Keras 库通过回调 API 提供了检查点功能。
ModelCheckpoint 回调类允许您定义检查点模型权重的存储位置、文件名命名方式以及在何种情况下创建模型检查点。
该 API 允许您指定要监控的指标,例如训练集或验证集上的损失或准确率。您可以指定是寻求最大化还是最小化得分的改进。最后,用于存储权重的文件名可以包含变量,如轮次(epoch)或指标。
然后,在调用模型的 `fit()` 函数时,可以将 `ModelCheckpoint` 传递给训练过程。
请注意,您可能需要安装 h5py 库才能以 HDF5 格式输出网络权重。
Python 深度学习需要帮助吗?
参加我的免费为期两周的电子邮件课程,发现 MLP、CNN 和 LSTM(附代码)。
立即点击注册,还将免费获得本课程的 PDF 电子书版本。
检查点神经网络模型改进
检查点的一个好用途是在训练过程中每次观察到改进时输出模型权重。
以下示例为 Pima 印第安人糖尿病发病率二分类问题创建了一个小型神经网络。该示例假定 `pima-indians-diabetes.csv` 文件位于您的工作目录中。
您可以从此处下载数据集
该示例使用 33% 的数据进行验证。
检查点设置为仅在验证集上的分类准确率有所提高时保存网络权重(`monitor='val_accuracy'` 且 `mode='max'`)。权重将存储在包含得分的文件中(`weights-improvement-{val_accuracy=.2f}.hdf5`)。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 |
# 验证准确率提高时检查点保存权重 from tensorflow.keras.models import Sequential from tensorflow.keras.layers import Dense from tensorflow.keras.callbacks import ModelCheckpoint import matplotlib.pyplot as plt import numpy as np import tensorflow as tf seed = 42 tf.random.set_seed(seed) # 加载皮马印第安人糖尿病数据集 dataset = np.loadtxt("pima-indians-diabetes.csv", delimiter=",") # 分割为输入 (X) 和输出 (Y) 变量 X = dataset[:,0:8] Y = dataset[:,8] # 创建模型 model = Sequential() model.add(Dense(12, input_shape=(8,), activation='relu')) model.add(Dense(8, activation='relu')) model.add(Dense(1, activation='sigmoid')) # 编译模型 model.compile(loss='binary_crossentropy', optimizer='adam', metrics=['accuracy']) # 检查点 filepath="weights-improvement-{epoch:02d}-{val_accuracy:.2f}.hdf5" checkpoint = ModelCheckpoint(filepath, monitor='val_accuracy', verbose=1, save_best_only=True, mode='max') callbacks_list = [checkpoint] # 拟合模型 model.fit(X, Y, validation_split=0.33, epochs=150, batch_size=10, callbacks=callbacks_list, verbose=0) |
注意:您的结果可能会有所不同,这取决于算法或评估过程的随机性,或者数值精度的差异。请考虑运行几次示例并比较平均结果。
运行该示例会产生以下输出(为简洁起见已截断)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
... Epoch 00134: val_accuracy did not improve Epoch 00135: val_accuracy did not improve Epoch 00136: val_accuracy did not improve Epoch 00137: val_accuracy did not improve Epoch 00138: val_accuracy did not improve Epoch 00139: val_accuracy did not improve Epoch 00140: val_accuracy improved from 0.83465 to 0.83858, saving model to weights-improvement-140-0.84.hdf5 Epoch 00141: val_accuracy did not improve Epoch 00142: val_accuracy did not improve Epoch 00143: val_accuracy did not improve Epoch 00144: val_accuracy did not improve Epoch 00145: val_accuracy did not improve Epoch 00146: val_accuracy improved from 0.83858 to 0.84252, saving model to weights-improvement-146-0.84.hdf5 Epoch 00147: val_accuracy did not improve Epoch 00148: val_accuracy improved from 0.84252 to 0.84252, saving model to weights-improvement-148-0.84.hdf5 Epoch 00149: val_accuracy did not improve |
您会在您的工作目录中看到许多包含 HDF5 格式网络权重的文件。例如:
1 2 3 4 5 |
... weights-improvement-53-0.76.hdf5 weights-improvement-71-0.76.hdf5 weights-improvement-77-0.78.hdf5 weights-improvement-99-0.78.hdf5 |
这是一个非常简单的检查点策略。
如果验证准确率在训练轮次中上下波动,这可能会创建许多不必要的检查点文件。尽管如此,它仍将确保您拥有运行过程中发现的最佳模型的快照。
仅检查点最佳神经网络模型
一个更简单的检查点策略是,仅当验证准确率提高时,将模型权重保存到同一个文件。
通过使用与上面相同的代码,并将输出文件名更改为固定名称(不包含得分或轮次信息),即可轻松实现这一点。
在这种情况下,只有当模型在验证集上的分类准确率高于迄今为止看到的最佳准确率时,模型权重才会写入文件 “weights.best.hdf5”。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
# 验证准确率最佳时检查点保存权重 from tensorflow.keras.models import Sequential from tensorflow.keras.layers import Dense from tensorflow.keras.callbacks import ModelCheckpoint import matplotlib.pyplot as plt import numpy as np # 加载皮马印第安人糖尿病数据集 dataset = np.loadtxt("pima-indians-diabetes.csv", delimiter=",") # 分割为输入 (X) 和输出 (Y) 变量 X = dataset[:,0:8] Y = dataset[:,8] # 创建模型 model = Sequential() model.add(Dense(12, input_shape=(8,), activation='relu')) model.add(Dense(8, activation='relu')) model.add(Dense(1, activation='sigmoid')) # 编译模型 model.compile(loss='binary_crossentropy', optimizer='adam', metrics=['accuracy']) # 检查点 filepath="weights.best.hdf5" checkpoint = ModelCheckpoint(filepath, monitor='val_accuracy', verbose=1, save_best_only=True, mode='max') callbacks_list = [checkpoint] # 拟合模型 model.fit(X, Y, validation_split=0.33, epochs=150, batch_size=10, callbacks=callbacks_list, verbose=0) |
注意:您的结果可能会有所不同,这取决于算法或评估过程的随机性,或者数值精度的差异。请考虑运行几次示例并比较平均结果。
运行此示例将产生以下输出(为简洁起见已截断)
1 2 3 4 5 6 7 8 9 10 11 12 |
... Epoch 00139: val_accuracy improved from 0.79134 to 0.79134, saving model to weights.best.hdf5 Epoch 00140: val_accuracy did not improve Epoch 00141: val_accuracy did not improve Epoch 00142: val_accuracy did not improve Epoch 00143: val_accuracy did not improve Epoch 00144: val_accuracy improved from 0.79134 to 0.79528, saving model to weights.best.hdf5 Epoch 00145: val_accuracy improved from 0.79528 to 0.79528, saving model to weights.best.hdf5 Epoch 00146: val_accuracy did not improve Epoch 00147: val_accuracy did not improve Epoch 00148: val_accuracy did not improve Epoch 00149: val_accuracy did not improve |
您应该在本地目录中看到权重文件。
1 |
weights.best.hdf5 |
这是您在实验中始终使用的便捷的检查点策略。
它将确保您的最佳模型在运行过程中被保存,以便您以后按需使用。它避免了在训练时需要包含任何代码来手动跟踪和序列化最佳模型。
将 EarlyStopping 与 Checkpoint 一起使用
在上面的示例中,尝试了使用 150 个轮次来拟合模型。实际上,很难确定需要训练模型多少个轮次。解决此问题的一种方法是高估轮次的数量。但这可能会花费大量时间。毕竟,如果您只检查点最佳模型,您可能会发现,在运行数千个轮次后,您已经在前一百个轮次中获得了最佳模型,并且之后不再进行检查点。
将 `ModelCheckpoint` 回调与 `EarlyStopping` 一起使用是很常见的。它有助于在连续多个轮次没有指标改进时停止训练。以下示例添加了回调 `es`,使训练在连续五个轮次未观察到验证准确率提高后提前停止。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 |
# 验证准确率最佳时检查点保存权重 from tensorflow.keras.models import Sequential from tensorflow.keras.layers import Dense from tensorflow.keras.callbacks import ModelCheckpoint, EarlyStopping import matplotlib.pyplot as plt import numpy as np # 加载皮马印第安人糖尿病数据集 dataset = np.loadtxt("pima-indians-diabetes.csv", delimiter=",") # 分割为输入 (X) 和输出 (Y) 变量 X = dataset[:,0:8] Y = dataset[:,8] # 创建模型 model = Sequential() model.add(Dense(12, input_shape=(8,), activation='relu')) model.add(Dense(8, activation='relu')) model.add(Dense(1, activation='sigmoid')) # 编译模型 model.compile(loss='binary_crossentropy', optimizer='adam', metrics=['accuracy']) # 检查点 filepath="weights.best.hdf5" checkpoint = ModelCheckpoint(filepath, monitor='val_accuracy', verbose=1, save_best_only=True, mode='max') es = EarlyStopping(monitor='val_accuracy', patience=5) callbacks_list = [checkpoint, es] # 拟合模型 model.fit(X, Y, validation_split=0.33, epochs=150, batch_size=10, callbacks=callbacks_list, verbose=0) |
注意:您的结果可能会有所不同,这取决于算法或评估过程的随机性,或者数值精度的差异。请考虑运行几次示例并比较平均结果。
运行此示例将产生以下输出
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
Epoch 1: val_accuracy improved from -inf to 0.51969, saving model to weights.best.hdf5 Epoch 2: val_accuracy did not improve from 0.51969 Epoch 3: val_accuracy improved from 0.51969 to 0.54724, saving model to weights.best.hdf5 Epoch 4: val_accuracy improved from 0.54724 to 0.61417, saving model to weights.best.hdf5 Epoch 5: val_accuracy did not improve from 0.61417 Epoch 6: val_accuracy did not improve from 0.61417 Epoch 7: val_accuracy improved from 0.61417 to 0.66142, saving model to weights.best.hdf5 Epoch 8: val_accuracy did not improve from 0.66142 Epoch 9: val_accuracy did not improve from 0.66142 Epoch 10: val_accuracy improved from 0.66142 to 0.68504, saving model to weights.best.hdf5 Epoch 11: val_accuracy did not improve from 0.68504 Epoch 12: val_accuracy did not improve from 0.68504 Epoch 13: val_accuracy did not improve from 0.68504 Epoch 14: val_accuracy did not improve from 0.68504 Epoch 15: val_accuracy improved from 0.68504 to 0.69685, saving model to weights.best.hdf5 Epoch 16: val_accuracy improved from 0.69685 to 0.71260, saving model to weights.best.hdf5 Epoch 17: val_accuracy improved from 0.71260 to 0.72047, saving model to weights.best.hdf5 Epoch 18: val_accuracy did not improve from 0.72047 Epoch 19: val_accuracy did not improve from 0.72047 Epoch 20: val_accuracy did not improve from 0.72047 Epoch 21: val_accuracy did not improve from 0.72047 Epoch 22: val_accuracy did not improve from 0.72047 |
此训练过程在第 22 轮结束后停止,因为在最后五个轮次中没有取得更好的准确率。
加载检查点神经网络模型
现在您已经了解了如何在训练过程中检查点深度学习模型,接下来需要回顾如何加载和使用检查点模型。
检查点仅包含模型权重。它假定您知道网络结构。模型结构也可以被序列化为 JSON 或 YAML 格式的文件。
在下面的示例中,模型结构是已知的,并且最佳权重已从之前的实验中加载,这些权重存储在工作目录中的 `weights.best.hdf5` 文件中。
然后,该模型用于对整个数据集进行预测。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
# 如何从检查点加载和使用权重 from tensorflow.keras.models import Sequential from tensorflow.keras.layers import Dense from tensorflow.keras.callbacks import ModelCheckpoint import matplotlib.pyplot as plt import numpy as np # 创建模型 model = Sequential() model.add(Dense(12, input_shape=(8,), activation='relu')) model.add(Dense(8, activation='relu')) model.add(Dense(1, activation='sigmoid')) # 加载权重 model.load_weights("weights.best.hdf5") # 编译模型(进行预测需要) model.compile(loss='binary_crossentropy', optimizer='adam', metrics=['accuracy']) print("Created model and loaded weights from file") # 加载皮马印第安人糖尿病数据集 dataset = np.loadtxt("pima-indians-diabetes.csv", delimiter=",") # 分割为输入 (X) 和输出 (Y) 变量 X = dataset[:,0:8] Y = dataset[:,8] # 使用加载的权重估计整个数据集的准确率 scores = model.evaluate(X, Y, verbose=0) print("%s: %.2f%%" % (model.metrics_names[1], scores[1]*100)) |
注意:您的结果可能会有所不同,这取决于算法或评估过程的随机性,或者数值精度的差异。请考虑运行几次示例并比较平均结果。
运行此示例将产生以下输出
1 2 |
Created model and loaded weights from file acc: 77.73% |
总结
在本篇博文中,您发现了对长时间运行的深度学习模型进行检查点的重要性。
您学习了两种可以在下一个深度学习项目中使用的检查点策略:
- 检查点模型改进
- 仅检查点最佳模型
您还学习了如何加载检查点模型并进行预测。
您对检查点深度学习模型或本文有任何疑问吗?在评论中提问,我会尽力回答。
79.56% 使用 3 个隐藏层架构,每个层有 24 个神经元
很棒的博客,学到了很多
谢谢 Gerrit,很高兴您觉得它有用。
请问,在多标签分类中,accuracy_score 的含义是什么?我应该考虑多标签分类的哪个指标?
谢谢
好问题!
不确定我是否有好的建议。我没有深入思考过准确率对多标签的影响——抱歉。
Jason,我如何用自定义指标检查点模型?您上面给出的示例代码是 monitor = ‘val_acc’,但当我将其替换为 monitor = my_metric 时,会显示以下警告消息
/usr/local/lib/python3.5/dist-packages/keras/callbacks.py:286: RuntimeWarning: Can save best model only with available, skipping.
‘skipping.’ % (self.monitor), RuntimeWarning)
那么我该如何处理这个问题?
Lau,好问题,
我没有尝试过用自定义指标进行检查点,抱歉。我无法给出好的建议。
你好,
试试这样
model = load_model( “your.model.h5”,
custom_objects={‘my_metric’: my_metric })
没错!感谢分享。
model.add_loss() 和 model.add_metric() 怎么样?
嗨,Jason,
很棒的帖子!
我使用回调 `ModelCheckpoint` 保存了模型和权重。如果我想从最后一个轮次继续训练,如何设置 `model.fit()` 命令使其从前一个轮次开始?有时,我们需要在几个轮次后更改学习率并从最后一个轮次继续训练。非常感谢您的建议。
Xu Zhang,好问题,
您可以将模型权重加载回您的网络,然后开始新的训练过程。
谢谢 Jason。我运行了一个轮次,损失降到了 353.6888。会话断开了,所以我使用了如下权重。但是,我没有看到损失有任何变化。我是否正确加载了权重?这是我的代码:
>>> filename = “weights-improvement-01–353.6888-embedding.hdf5”
>>> model.load_weights(filename)
>>> model.compile(loss=’binary_crossentropy’, optimizer=’adam’)
>>> model.fit(dataX_Arr, dataY_Arr, batch_size=batch_size, nb_epoch=15, callbacks=callbacks_list)
Epoch 1/15
147744/147771 [============================>.] – ETA: 1s – loss: -353.6892Epoch 00000: loss improved from inf to -353.68885, saving model to weights-
看起来您正确加载了权重。
Jason,关于上面继续从保存的检查点训练的观点,我是否需要初始设置随机种子并在第二次训练时使用相同的种子?我注意到的是,第一次训练时,损失似乎在减少。但是当我加载检查点并继续训练时,性能突然变得非常差。
不行。
您可以预期模型在不同运行之间存在差异,更多信息请参见此处:
https://machinelearning.org.cn/faq/single-faq/why-do-i-get-different-results-each-time-i-run-the-code
Jason,又一篇很棒的帖子,谢谢!
很高兴您觉得它有用,Anthony。
Jason,谢谢您的教程。我想在 iris-flower 模型脚本中实现此检查点功能,但未能成功。它一直显示此错误,我不知道如何解决。
我将“model checkpoint”行放在“baseline model”函数之后,并添加了“callbacks”。
RuntimeError: Cannot clone object , as the constructor does not seem to set parameter callbacks
感谢您的帮助
Nasarudin,您好,抱歉,我不确定此错误的根本原因。
我相信您不能在使用 `KerasClassifier` 时使用类似检查点的回调,正如 Iris 教程中的情况一样。
https://machinelearning.org.cn/multi-class-classification-tutorial-keras-deep-learning-library/
Jason,您好。谢谢您的回复。我有一些数据集看起来与 iris 数据集相似,但它大得多。我以为我可以在训练数据集时使用回调。
由于训练大型数据集可能需要很长时间,您是否有任何建议在 CardioClassifier 中实现其他功能来实现检查点?(这部分原文有点奇怪,我尝试理解并翻译)
顺便说一句,您可以参考此链接查看我编写的用于实现 KerasClassifier 检查点功能的脚本。
http://stackoverflow.com/questions/41937719/checkpoint-deep-learning-models-in-keras
谢谢你。
Nasarudin,您好,
如果您想使用检查点,我建议使用独立的 Keras 模型,而不是 sklearn 包装器。
很棒的教程,喜欢您的页面。我有个问题:我正在尝试使用 ModelCheckpoint 基于 val_acc 来优化模型。但是,我很快就获得了很好的结果(例如:val_acc = .98)。这是我的最大验证集准确率,因此将保存模型(save_best_only)。但是,有几个轮次得到了相同的最大验证集准确率,而后面的轮次具有更高的训练准确率。例如,第 3 轮:acc = .70, val_acc = .98,第 50 轮:acc = 1.00, val_acc = .98。显然,我希望保存第二个模型,它在数据上具有泛化能力,并且显示了很好的训练效果。我该如何在不保存每个轮次的情况下实现这一点?基本上,我想为 monitor(monitor=val_acc,acc)传递第二个排序参数。
谢谢。
好问题,凭直觉,我认为您可以传递多个指标来进行检查点。
尝试使用多个检查点对象?
如果这对您有帮助,这里是文档:
https://keras.org.cn/callbacks/#modelcheckpoint
理想情况下,您希望在训练数据集和验证数据集上的性能之间取得平衡。
是的,它不允许我传递数组列表或多个参数,根据文献,它只期望一个参数。目前,我只能使用 `val_acc` 作为瓶颈/顶层,`val_loss` 作为最终模型,但我希望有更多的控制。也许我会为此提出功能请求。
好主意,在 Keras 项目上添加一个 issue。
Abner,您现在解决这个问题了吗?
希望收到您的回复。
您可以定义一个同时包含 `val_acc` 和 `val_loss` 的自定义指标。
Jason,谢谢您的教程。我有一个问题,如果我的输入包含两张具有不同标签的图片(标签代表图片的受欢迎程度)。我需要知道如何输入这对图像,使得第一张图片通过 CNN1,第二张通过 CNN2,然后我可以使用合并层将它们合并,以分类哪一张比另一张更受欢迎。我该如何使用库来处理这两种不同的输入?
Fatma,您好,
也许您可以重新定义您的问题,输出一张图片的受欢迎程度,然后使用“if”语句分别对每张图片的相对受欢迎程度进行排序?
我需要比较两张输入图像的受欢迎程度值,以便输出是第一张图像比第二张图像更受欢迎,或者反之亦然,然后当我输入一张(未标记的)测试图像时,它应该与训练数据的一些基线进行比较,以计算其受欢迎程度。
Jason,一如既往的精彩教程。
我想问一下关于脚本中的 'validation_split'。这个带有 'validation_script' 变量的脚本与这里没有 'validation_split' 变量的脚本有什么区别 https://machinelearning.org.cn/tutorial-first-neural-network-python-keras/?
Nasarudin,这是个好问题。
如果您使用了`validation_split`,它会在训练期间提供有关模型在“未见过”数据上性能的反馈。使用检查点时,这会很有用,因为您可以在验证数据上的性能停止改进时停止训练(这是模型可能过拟合的迹象)。
谢谢!
不客气!
Jason,非常感谢您的教程!
您能否提供一个示例代码,以便像这样可视化结果:绘制一些验证数据集的图像及其前 5 个标签预测?
是的,您可以使用网络的概率输出来实现这一点。
抱歉,目前我没有示例。
感谢您的教程,Jason 🙂
很高兴您觉得它有用,Pratik。
先生您好,我想感谢您提供这个很棒的教程,
目前我每 50 个 epoch 检查点我的模型。我还想检查点任何 val_acc 更好的但不等于第 50 个 epoch 的 epoch。例如,我检查点了第 250 个 epoch,但第 282 个 epoch 的 val_acc 更好,我必须保存它,但由于我指定了周期为 50,所以我无法保存第 282 个 epoch。
我是否应该在 ModelCheckPoint 中同时实现 `save_best_only=true` 和 `period=50` 这两个属性?
抱歉,我不太明白。
您可以使用检查点保存模型的任何改进,而无需考虑 epoch。也许这会是一种尝试的方法?
嗨,Jason,
我非常喜欢您的教程,但只是对如何将检查点与交叉验证结合起来感到有点困惑。正如您在另一篇教程中所展示的,我们在进行交叉验证时不会显式调用 `model.fit`。您能否举一个如何将检查点添加到其中的示例?
您可能需要手动运行 k 折交叉验证过程(例如,自己循环遍历折叠)。
喜欢您的文章。在这里学到了很多东西。
请继续您的教程!
谢谢,听到这个我很高兴。
Jason,您的博客太棒了。感谢您帮助我们学习这个出色的领域。
很高兴您觉得它有用,Abolfazl。
您好,很棒的文章!我想保存训练模型而不是验证模型,如何在 `checkpoint()` 中设置参数?
保存的是训练过的模型,没有验证模型。只是用验证数据对模型进行评估。
是否可以在 epoch 之间进行检查点?
我的数据集非常大,每个 epoch 需要 20 小时,而且在完成一个 epoch 之前就失败了。如果我能在大约每五分之一 epoch 进行一次检查点,那就太好了。
我建议使用数据生成器,然后在使用固定数量的批次后使用检查点。这可能会奏效。
Jason,您的博客很棒。您是否也知道如何在训练期间保存/存储最后观察到的改进的 epoch 数量?这对研究过拟合会很有用。
是的,您可以将“epoch”变量添加到检查点文件名中。
例如
是否可以将 Keras 检查点与 Gridsearch 一起使用?以防 Gridsearch 崩溃?
Jes,这不是个好主意。我建议做一个自定义网格搜索。
收到以下错误
TypeError Traceback (most recent call last)
in ()
72
73 filepath=”weights.best.hdf5″
—> 74 checkpoint = ModelCheckpoint(filepath, monitor=’val_acc’, verbose=0, save_best_only=True,node=’max’)
75 callbacks_checkpt = [checkpoint]
76
TypeError: \_\_init\_\_() got an unexpected keyword argument ‘node’
看起来是拼写错误。
仔细检查一下您是否从教程中确切复制了代码?
嗨,Jason!
感谢这篇信息丰富的帖子。
我有一个问题——如果运行意外停止,我们就有到目前为止的最佳模型权重。如何使用此检查点作为起点继续剩余的 epoch?
您可以加载权重,教程中就有完全相同的示例。
感谢如此好的解释。我想问一下,如果我们正在做一些实验并且希望神经网络模型在测试集上达到高准确率。我们可以使用此方法找到最佳调整的网络或可能的最高准确率吗????
此方法可以帮助在训练期间找到并保存性能良好的模型。
非常酷。
谢谢。
根据这个例子,保存或检索检查点模型通常需要多长时间?
非常快,对于大型模型来说只需要几秒钟。
谢谢,Jason。您能否给出估计值,超过 10 秒?
大型模型可能需要一分钟左右。
好帖子。
不过,我有一个问题。除了读取文件名之外,我还能通过其他方式获取模型训练的 epoch 数量吗?
我的用例是:加载模型后,我想从保存它的点恢复训练(通过向 `.fit()` 中的 `initial_epoch` 参数传递一个值),以便在 TensorBoard 中获得更好的图表。
例如,我训练了我的模型 2 个 epoch(得到 2 条消息:“Epoch 1/5”,“Epoch 2/5”)并保存了它。现在,我想加载该模型并从第 3 个 epoch 继续训练(我期望得到消息“Epoch 3/5”等)。
除了将 epoch 保存到文件名然后从中获取(这似乎有点混乱)之外,还有更好的方法吗?
您可以从文件名中读取。它只是一个字符串。
您还可以有一个回调函数将最后一个完成的 epoch 写入文件,并每次覆盖该文件。
怎么做,我没明白流程
casper,您可能会发现以下资源有帮助
https://keras.org.cn/api/callbacks/model_checkpoint/
很棒的文章和很棒的博客!我非常感谢您!
谢谢,听到这个我很高兴。
您好。很棒的文章!有个小问题:您是否遇到过这个问题?“callbacks.py:405: RuntimeWarning: Can save best model only with val_acc available, skipping.”
我在 AWS GPU 计算实例上运行,供您参考。我没有直接从 Keras.Sequence() 模型运行……而是使用了 SearchGridCV,因为我正在尝试执行一些调优任务,但想保存最佳模型。有什么建议吗?
我建议不要将检查点与交叉验证或网格搜索结合使用。
嗨,Jason,
非常感谢您的所有文章,非常有帮助。您能解释一下为什么有些 epoch 会提高验证准确率,而之前的 epoch 不会吗?如果您的数据集不使用任何随机采样(例如,没有 dropout),那么为什么 epoch 12 会提高验证分数而 epoch 11 不会?它们难道不是基于相同的起点(由 epoch 10 输出的模型)吗?
谢谢!
该算法是随机的,并非每次更新都能提高所有数据的分数。
这是学习算法梯度下降的一个特性,它尽力而为,但无法“看到”问题的整个状态,而是分块地、逐步地运行。这是一个特性,而不是 bug。它通常会带来更好的结果。
这有帮助吗?
我很好奇这两个版本有什么不同??
似乎只有 filepath 不同?
一个保留所有改进,一个只保留最佳。
为什么 filepath 变量如此神奇?仅仅改变 filepath 变量就可以产生这些不同的结果。这是如何实现的?
这是 Keras API。
最后,如果我添加一行代码 `model.save_weights('weights.hdf5')`,这与 ModelCheckpoint 的最佳权重有什么区别?
区别在于您保存的是最后一个 epoch 之后的模型的权重,而不是模型技能发生变化的时候。
当我添加一行代码 `model.save_weights('weights.hdf5')` 来保存最终模型的权重时;同时我也保存了 ModelCheckpoint 的最佳权重,我发现这两个 hdf5 文件并不相同。我很困惑,为什么我保存的最终模型权重不是最佳模型权重。
是的,这就是检查点的意义,最后一个 epoch 的模型可能不是最佳模型,事实上它通常不是。
检查点会保存过程中找到的最佳模型。
这有帮助吗?也许可以重读一下教程让它更清楚?
好的,谢谢。从某种意义上说,当我们使用了检查点时,再次使用 `model.save_weights('weights.hdf5')` 就没有意义了。
总的来说,是的。
Jason,您好。您的博客很棒,继续加油!
我有一个问题。问题是如何将 jupyter 代码(例如下一个词预测)运行到浏览器中?以及如何创建用户界面?
非常感谢!
Demeke,您是对如何使用 Jupyter Notebook 感兴趣吗?
嗨,Jason,
我如何检查点一个回归模型?在这种情况下,我的指标是准确率还是 MSE?在这种情况下,我应该在 modelcheckpoint 中监控什么?我正在训练一个时间序列模型。
谢谢
指标将是损失或误差。您可以在训练期间指定一组要记录的指标。
https://machinelearning.org.cn/custom-metrics-deep-learning-keras-python/
选择一个并将其用于检查点。
嗨 Jason
在运行 50 个 epoch 时,我每 5 个 epoch 检查点并保存权重。
现在,在第 27 个 epoch 之后,VM 断开了连接。
然后我重新连接并加载保存的权重后编译模型。现在,如果我进行评估,我应该得到第 27 个 epoch 之前最佳权重的分数。但是由于只考虑了 25 个 epoch,准确率不会很好,对吧?
在这种情况下,我如何继续使用保存的权重进行剩余的 25 个 epoch?
谢谢
您可以加载一组权重并继续训练模型。
Jason,感谢您的教程。如果我想提取模型中所有层的权重值,该怎么做?谢谢
我相信每个层都有 `get_weights()` 函数。
嗨,Jason,
感谢您提供的所有精彩教程,包括这篇。是否可以同时进行 Grid Search 模型超参数和检查点模型?我可以分别进行这两项,但不能同时进行。您能向我们展示一下吗?
谢谢,
Michael
可以,但您必须自己编写网格搜索的 for 循环。sklearn 无法提供帮助。
Jason,非常感谢您提供出色的教程。
很高兴它有帮助。
epoch 的键值“02d”和 val_acc 的“.2f”是来自哪里?
字符串格式化规则。它们已经存在了大约 50 年,在几乎所有语言中都有。
也许这会有帮助
https://mkaz.blog/code/python-string-format-cookbook/
有没有办法将模型权重检查点保存到内存而不是文件中?
在您的示例中,您最大化了 val_acc。最大化 val_acc 与最小化 val_loss 的优点是什么?
感谢您提供精彩的文章!
我相信您可以编写一个自定义回调来执行此操作。我没有示例。
您可以选择对您来说重要的事情,当使用模型进行预测时,准确率可能与您更相关。
非常感谢,有意识地设计和实现模型检查点是一个很好的实践。
谢谢。
Jason,感谢您的文章(以及我读过的许多其他文章!)。
我想知道:在用 `model.fit(....)` 拟合并使用检查点后,您将在外部文件中保存模型权重。但是,在训练结束后 `model` 实例的具体状态是什么?它将是最佳权重还是训练期间最后计算的权重?
总结一下。如果我想在训练/拟合后立即在测试集上进行预测,我应该加载外部文件中的最佳权重然后进行预测,还是可以在 `model.fit(...)` 之后直接使用 `model.predict(...)`?
非常感谢您的支持!
文件将包含检查点时的模型权重。可以加载这些权重并直接用于进行预测。这就是检查点的全部意义——保存训练过程中找到的最佳模型。
嘿 Jason,感谢您的回复。是的,那对我来说很清楚。不清楚的是训练结束时 `model` 拥有什么权重。
我们假设我正在使用
callbacks = [
EarlyStopping(patience=15, monitor='val_loss', min_delta=0, mode='min'),
ModelCheckpoint('best-weights.h5', monitor='val_loss', save_best_only=True, save_weights_only=True)
]
训练完成后,我将获得保存在 `best-weights.h5` 中的最佳权重,但 `model` 实例中存储的权重是什么?如果我执行 `model.evaluate(...)`(不加载 `best-weights.h5`),它会使用最佳权重还是仅仅是最后一个 epoch 对应的权重?
它们是检查点触发时的权重。如果触发次数很多,您可能会保存许多权重文件。
模型实例将具有最后一个 epoch 的权重,而不是最佳权重。
我有一个我自己的预训练模型(.ckpt 和 .meta 文件)。如何使用这些文件从我的数据集中提取矩阵形式的特征,其中行代表样本,列代表特征?
也许在 Python 中手动加载,然后尝试手动填充一个定义的 Keras 模型?
非常感谢您的精彩介绍。但我需要澄清一点。当我使用两个回调函数 model *ModelCheckpoint* 和
我没懂,能详细说明一下吗?
嗨,Jason,
感谢您的教程。我想知道这种方法是否适用于 GridSearch,以及我如何将检查点用于跟踪结果。另外,我目前正在使用 Colab Research Notebook,有没有办法检测进程中断并使用检查点来保存模型?
再次感谢您的帮助!!
不,网格搜索和检查点是相互冲突的。
我不熟悉“Colab Research Notebook”,它是什么?
https://colab.research.google.com。谷歌的一项倡议,推广带有免费虚拟机、GPU 和 TPU 处理内核(仍是实验性的)的笔记本。但它会在短时间不使用后断开与内核的连接,并且虚拟机在几个小时后可能会被卸载。因此,对于深度学习应用来说,检查点并保存状态以在重新连接后继续至关重要。
网格搜索太糟糕了。如何在没有检查点的情况下进行超参数微调和过程监控(验证结果可视化、可能的过拟合、方差偏差等)?
谢谢!
当您进行网格搜索时,您想知道哪些超参数能提供良好的性能。模型会被丢弃——不需要检查点。之后,您可以使用好的配置来拟合一个新模型。
是的,没错,但是,如果不能在不与服务器断开连接的情况下完成,我将永远不知道模型,所以检查点仍然很有用。但如果您有其他想法可以一起进行调整,请告知我们!
谢谢!🙂
为什么你需要这个模型?
网格搜索期间的模型会被丢弃。您只需要性能最佳的模型对应的超参数。
更新
Keras Cross Validation 和 Checkpointing 似乎存在一个问题,需要一些特殊的处理。
https://github.com/keras-team/keras/issues/836
我无法理解为什么他们在没有解决方案的情况下关闭了这个问题,只是把我的问题丢在那里。
我会尝试弄清楚如何做到这一点……
“网格搜索期间的模型会被丢弃。您只需要性能最佳的模型对应的超参数。”
抱歉,我没说清楚,我无法在我的笔记本上运行 Keras,它已经超过 12 年了。我找到的唯一免费基础设施是 Colab Notebook,要完全运行 GridSearchCV 的所有模型,我需要检查点并重新启动计算,因为 Google 虚拟机中的进程持久性不会持续很长时间,有时不到几个小时。
嗨 Jason
我有一个关于加载权重后编译模型的问题。
# 加载权重
model.load_weights(“weights.best.hdf5”)
# 编译模型(进行预测需要)
model.compile(loss=’binary_crossentropy’, optimizer=’adam’, metrics=[‘accuracy’])
当我查看 Keras API https://keras.org.cn/models/model/#compile 的 compile 函数描述时,它说“配置模型进行训练”。我不明白为什么我们需要编译模型来进行预测?
另外,您可能也想知道,Pima Indians 发病糖尿病二元分类问题的训练数据集已不再可用。
谢谢
谢谢,您可能不再需要编译模型就可以加载它了,也许 API 已经改变了。
我正在训练一个模型,大约 100 个 epoch。现在假设停电了。我有一个以 hdf5 格式保存的模型检查点……模型运行了 30 个 epoch。但我有以 val_acc 监控保存的模型检查点。
在这种情况下,我如何加载同一个模型的检查点来继续中断的训练?它会从第 30 个 epoch 继续训练模型吗?如果能回答我的问题,将非常有帮助。
提前感谢。
是的,您可以继续训练。
Hi Jason,感谢您的教程,它们非常有帮助。我实现了一个模型,然后正确地保存了它。但不幸的是,当我重新加载模型(相同的结构)并加载保存的权重时,我无法获得与之前相同的预测,结果略有下降。我的模型是一个简单的模型
model = Sequential()
model.add(LSTM(200, activation='relu', input_shape=(n_timesteps, n_features)))
model.add(Dense(100, activation=’relu’))
model.add(Dense(n_outputs))
model.compile(loss=’mse’, optimizer=’adam’)
检查点是
checkpoint = ModelCheckpoint(filename, monitor=’val_loss’, verbose=1, save_best_only=True, mode=’min’)
callbacks_list = [checkpoint]
model.fit(train_x, train_y, validation_split=0.15, epochs=epochs, batch_size=batch_size,
callbacks=callbacks_list, verbose=verbose)
然后我重新构建相同的结构,然后调用
model.load_weights(“filename”)
预测结果有些不同。提前感谢。
这很令人惊讶,模型在保存前后应该做出完全相同的预测。任何其他情况都可能是您的代码或 Keras 的错误。尝试缩小范围,这里有一些想法。
https://machinelearning.org.cn/faq/single-faq/can-you-read-review-or-debug-my-code
也许是因为当我重新加载权重时,我重新加载了保存到文件的最佳结果,而在第一次运行时,权重在 model.fit() 结束时是不同的?
我重新加载训练模型的准确方式是:不使用 ModelCheckpoint(filename, monitor=’val_loss’, verbose=1, save_best_only=True, mode=’min’)。我创建模型,训练它,然后使用 model.save(file)。然后使用 model.load(file) 我得到相同的结果。但这里有一个问题:它是最佳模型吗?因为我现在没有告诉它 monitor=’val_loss’, mode=’min’, save_best_only 等……我只是拟合模型然后保存它。
我明白了,我认为我在这个关于提前停止的帖子中涵盖了这个问题。
https://machinelearning.org.cn/how-to-stop-training-deep-neural-networks-at-the-right-time-using-early-stopping/
嗨,Jason,
非常有用的教程。我能否在每个 mini-batch 而不是每个 epoch 之后保存模型?
是的,您可以通过自定义回调来实现这一点。
谢谢您的回复。
是否有关于这个自定义回调的模板?
是的,您可以在此处了解更多信息(“创建回调”下)
https://keras.org.cn/callbacks/
谢谢。我按照说明创建了一个自定义回调来
(1) 在每个 epoch 结束时,将整个模型保存到一个文件(model_pre.h5),然后后处理该文件并将其转储到 model_post.h5
(2) 在下一个 epoch 开始时,从后处理的文件 model_post.h5 加载模型
实现 (1) 和 (2) 的代码的主要部分如下:
但通过 HDF5View 查看参数值时,似乎模型没有通过“./model_post.h5”文件正确更新。您能告诉我我做得对吗?谢谢。
-Jinwen
哇!
我很惊讶可以在每个批次或 epoch 之前加载模型。也许这并没有按预期工作?
Hi Jason,感谢这个很棒的教程!
在回归任务中,在 'val_loss' 和其他指标(如 'mse'、'mape' 等)之间,对于 monitor 参数,哪个对最终模型更重要?
也许我基本上是在问损失和指标之间的根本区别……?
我一直在猜测,我可能需要选择一个指标而不是 'val_loss' 来查看最终模型的预测性能。这是否正确?
损失和指标可以相同也可以不同。
这取决于您和项目利益相关者在最终模型(指标)中看重什么,以及必须优化什么才能实现这一点(损失)。
你好 Jason,感谢您的帖子。
作为建议,您能否向我们展示如何使用 Xgboost 进行检查点?我很难自己弄清楚。
谢谢您的建议。也许这篇帖子可以作为起点。
https://machinelearning.org.cn/avoid-overfitting-by-early-stopping-with-xgboost-in-python/
你好 Jason,
非常直接。您让它很容易遵循。这确实不那么抽象。
谢谢你。
谢谢,很高兴它有帮助。
我使用这篇帖子作为模型的基准。我一直使用 keras_metrics 模块中的 precision 和 recall,但似乎无法将它们作为 checkpoint 函数的监控指标。它只是告诉我
RuntimeWarning: 只能在 val_recall 时保存最佳模型:可用:跳过。
但在每个 epoch 之后,val_recall 都会被计算并显示出来,所以我不太确定出了什么问题?
“monitor”是否设置为您的自定义指标?
亲爱的 Jason,
我对 Keras 回调感到困惑。您使用 save_best_only=True 来保存权重,但根据 Keras,这是保存最新最佳模型的设置。对于权重,应该是 save_weights_only=True。默认情况下,save_weights_only 设置为 false。我是否遗漏了什么?
另外,在我的一台 Jupyter Notebook 中,我的权重根本没有保存,但在另一台却保存了,尽管代码是相同的。这很奇怪。
亲爱的 Jason,
我现在明白了。当您加载“weights.best.hdf5”时,您实际上是在加载包含权重的完整模型。所以不需要提前创建模型。
在“加载检查点神经网络模型”部分,我跳过了第 11-14 行,然后
from keras.models import load_model
model = load_model(“weights.best.hdf5”)
我得到了相同的结果。
干得不错。
谢谢。
也许您应该更新文本,因为您现在写的是“检查点仅包含模型权重。它假定您知道网络结构”,这是不正确的。检查点包含完整的模型。
如果只保存权重,则应为“save_weights_only=True”。
令人困惑的是,可以通过 model.load_weights 来处理完整模型文件作为权重。我个人认为它应该发出警告。
谢谢。
也许尝试从命令行运行示例?
感谢这个很棒的教程!
不客气,我很高兴它有所帮助。
你好 Jason,
又一个很棒的教程!
我想问您如何监控我的 val_top_k_categorical_accuracy 而不是 val_acc?
我在网上找不到任何关于它的信息。
我尝试过不同的方法,更改我的指标位置 `metrics=['top_k_categorical_accuracy', 'accuracy']`,尝试 `monitor="top_k_categorical_accuracy"`……但都没有成功。
有趣。如果您将指标添加到指标列表中,它是否会出现在 history dict 中?
如果是,您可以使用该名称。
好主意,但不行,我在 history dict 中得到了“val_top_k_categorical_accuracy”,但它不适用于 checkpoint monitor。
这很令人惊讶。也许可以尝试将代码和问题发布到 Keras 用户组。
https://machinelearning.org.cn/get-help-with-keras/
无论如何,我通过定义自己的回调解决了这个问题,该回调在我观察到任何“val_*”改进时保存模型。
做得好,我也会这样做:)
每次我搜索问题的答案时,您的博客都能解决它!工作出色,非常感谢!
谢谢!
一如既往,精彩教程。
谢谢!
我无法按照您的说明保存模型,它没有报错,但也没有注册。
感谢您的帮助。
很抱歉听到这个。也许尝试将您的示例简化为最简单的代码示例?
也许尝试将您的代码和问题发布到 stackoverflow?
当我使用自定义指标时,如何加载权重?
如下
谢谢你,Jason。
但对于 load_weights 呢?
model.load_weights("bestweights.hdf5")
不幸的是,此函数看不到自定义指标。
是的,您必须在同一个作用域中定义指标并加载权重。
抱歉,但我不明白您的意思。
对于某个问题,我尝试使用 CNN 模型在 5 个交叉验证上解决它,我通过 5 折的平均损失和 5 折的平均准确率来找到它的性能。(我会在达到最低验证损失时停止训练)
1- 这是计算模型性能的正确方法吗?
然后我在相同的数据集上使用 LSTM 评估相同的问题。
2- 现在,我想选择最佳模型,如何选择?
3- 最佳模型是损失最低的模型还是准确率最高的模型,还是什么?
对于 MLP 来说是合理的,交叉验证对于 LSTM 是不合理的。您必须使用前向步进验证。
https://machinelearning.org.cn/backtest-machine-learning-models-time-series-forecasting/
我的问题不是时间序列。它是 NLP 文本相似度。
在这种情况下,LSTM 的交叉验证是否合理?
是的,可能是。
我的问题是回归而不是分类?
那么,对于同一个问题和同一个数据集,如何选择最佳模型(CNN、LSTM等)呢?
我应用了多个算法(CNN、LSTM)来解决我的问题(文本相似度)。我该如何选择最佳算法?
最佳算法是验证损失最低的算法吗?
通常是根据复杂性(最小化)和技能(优化特定领域指标)来选择模型。
损失是特定领域指标的一个很好的代理,但很难与领域专家/利益相关者沟通。
你好,
如果我想检查最佳模型和训练因其他原因中断时的最后一个 epoch 的模型,该怎么做?
也许为每种情况配置不同的 ModelCheckpoint 实例?
亲爱的 Jason,
我们正在使用以下语句来保存模型。
model.compile(optimizer=’adam’, loss=’mse’, metrics=[‘accuracy’])
filepath=”model_lstm_10M_{epoch:02d}.h5″
checkpoint = ModelCheckpoint(filepath, period=1000, verbose=1, save_best_only=False)
#tbCallBack = TensorBoard(log_dir=’./log’, histogram_freq=0, write_graph=True, write_images=True)
callbacks_list = [checkpoint]
# 拟合模型
model.fit(train_data, target, epochs=10000,batch_size=4,callbacks=callbacks_list,verbose=2)
model.save(‘model_10M_lstm_100.h5’)
我们在 2300 个 epoch 时停止训练,当重新开始时,它从 epoch 1 开始,我希望从之前的 epoch(2300)继续。我们需要做哪些更改才能实现这一目标?
提前感谢
训练总是从 epoch 0 开始。
如果您加载模型并再次开始训练,它将从上一次运行的末尾的权重开始。只有 epoch 号会重置,权重不会。
如果您知道完成了多少个 epoch,您可以从第二个运行中您希望使用的 epoch 数量中减去该数字。
你好,Jason。你的课程非常好,我学到了很多。但有一个小 bug,我认为是 API 更新了。代码
checkpoint = ModelCheckpoint(filepath, monitor=’val_accuracy’, verbose=1, save_best_only=True, mode=’max’)
参数 'monitor' 应该是 'val_acc' 而不是 'val_accuracy'
示例假定 Keras 2.3 或更高版本,在这种情况下必须使用 val_accuracy。
对于旧版本的 Keras,必须使用 val_acc。
你好 Jason,你知道有什么方法可以同时保存最后一个检查点模型的 epoch 号吗?
我想做的是,训练完成后,评估对应“最佳检查点模型”的训练 epoch 的训练和验证损失之间的差异,以作为该精确点的误差差距的参考。
目前我从模型验证结果中计算这个“误差差距”:训练损失 vs 测试损失。
提前感谢您!
你可以把它保存在模型的文件名里
很棒的清晰帖子
ModelCheckpoint 不是保存带有权重的完整模型吗?
我认为“save_weights_only”默认为 false
谢谢。
是的,看起来它会保存整个模型
https://keras.org.cn/callbacks/#modelcheckpoint
我正在尝试在每个 epoch 后保存我的模型。我正在监控准确率。第一个 epoch 后,我收到一个 OS 错误:“无法打开文件:name = '/logs/weights-improvement-01-0.55.hdf5', errno = 2, error message = 'No such file or directory', flags = 13, o_flags = 242)”。请告知。
也许可以尝试保存到不同的位置,例如 /tmp/?
嘿。很棒的博客。我想问一下,当它是最佳 epoch 时,我如何做一些事情(例如保存图像)?
谢谢!
你可以创建自己的回调,并根据你喜欢的任何条件执行任何操作。
Jason,非常感谢您的教程!
我有一个疑问,选择在验证集上表现最佳的模型权重(monitor = val_accuracy, mode = ‘max’),这会不会是一个有些乐观的结果?
另一方面,检查点是否总是基于验证集应用的?
如果验证数据集很小或不具代表性,则可能如此。
你好 Jason,感谢你的贡献。
我只需要澄清一些事情。
设计完 DNN 后,我们
1. 编译()
2. 拟合()
3. 评估()
如果最后一个 epoch 的模型不是具有最佳权重的模型,为什么我们不总是使用回调来保存最佳模型,并用这些模型进行评估?
1. 编译()
2.使用回调进行拟合()以保存最佳权重
3. 加载最佳权重
4. 编译()
5. 评估()
听起来没错。
你好 @Jason,我看到了加载模型和评估它的两种选择。
1. 如果我们在 EarlyStopping 中设置 restore_best_weights = True,我们可以使用 model.evaluate,因为它会恢复最佳权重(不一定是最后一个 epoch 的)或者我们可以 model.save(model_path) 然后稍后重新加载进行评估。
early_stopping = EarlyStopping(
.....
restore_best_weights=True)
fit1 = model.fit(….., callbacks = [early_stopping])
eval1 = mode.evaluate(test_data)
model.save(model_path)
saved_model = tf.keras.models.load_model(model_path)
saved_model.evaluate(test_data)
2. 另一种选择是使用 checkpoint
model_checkpoint = ModelCheckpoint(monitor=’val_loss’, verbose=2, save_best_only=True,
filepath=checkpoint_path)
fit2 = model.fit(….., callbacks = [model_checkpoint])
checkpoint_model = tf.keras.models.load_model(checkpoint_path)
eval2 = checkpoint_model.evaluate(test_daa)
通常我们同时使用这两种回调 model.fit(….., callbacks = [early_stopping,model_checkpoint])
在这种情况下,如果 restore_best_weights=True,eval1 和 eval2 将相同。
但是如果 restore_best_weights=False,如果 fit1 的最后一个 epoch 不是最佳的,则 eval1 会比 eval2 差。
你好 @Jason……在训练过程中,是模型提高了还是只有权重?
权重就是模型。训练会改变权重。
嗨,Jason,
不错的教程,但我无法运行它。
我在第 15 行 model.add(Dense(12, input_dim=8, activation=’relu’)) 收到以下错误
module ‘tensorflow.python.framework.ops’ has no attribute ‘_TensorLike’
File “/Users/mact/Projects/src/test.py”, line 18, in get_model
model.add(Dense(12, input_dim=8, activation=’relu’))
提前感谢
很抱歉听到这个消息,这些技巧会有帮助
https://machinelearning.org.cn/faq/single-faq/why-does-the-code-in-the-tutorial-not-work-for-me
感谢分享 Jason Brownlee。
我有一个问题。目前,checkpoint 保存每个 epoch 和改进。如果我想每 N 个 epoch 或 N 个 batch_size 保存一次,我该怎么做?你能给我一些建议吗?非常感谢。
我看到参数 save_weights_only = False,所以最后一篇主题的例子,你不必通过以下命令创建模型:# create model
model = Sequential()
model.add(Dense(12, input_dim=8, activation=’relu’))
model.add(Dense(8, activation='relu'))
model.add(Dense(1, activation=’sigmoid’))
因为在保存的文件中有模型和权重。
是的,我们可以一次性加载架构和权重。
不客气。
你可能需要手动枚举 epoch 并用 if 语句保存,或者编写一个自定义的回调。
尊敬的先生,
请帮我一下,因为我发现我的模型实现中的性能波动很大。我使用了一个包含 430 个样本和 146 个预测变量的数据集。
以下是显示验证和训练准确率波动的几个 epoch。
Epoch 230: val_accuracy did not improve from 0.69767
6/6 – 0s – loss: 0.4888 – accuracy: 0.7093 – val_loss: 11.5274 – val_accuracy: 0.5756 – 57ms/epoch – 9ms/step
Epoch 231/500
Epoch 231: val_accuracy did not improve from 0.69767
6/6 – 0s – loss: 0.4977 – accuracy: 0.6570 – val_loss: 11.3789 – val_accuracy: 0.5930 – 57ms/epoch – 10ms/step
Epoch 232/500
Epoch 232: val_accuracy did not improve from 0.69767
6/6 – 0s – loss: 0.4876 – accuracy: 0.6744 – val_loss: 11.9553 – val_accuracy: 0.6047 – 55ms/epoch – 9ms/step
Epoch 233/500
Epoch 233: val_accuracy did not improve from 0.69767
6/6 – 0s – loss: 0.4989 – accuracy: 0.7035 – val_loss: 12.4012 – val_accuracy: 0.6047 – 68ms/epoch – 11ms/step
Epoch 234/500
Epoch 234: val_accuracy did not improve from 0.69767
6/6 – 0s – loss: 0.5058 – accuracy: 0.6628 – val_loss: 11.9185 – val_accuracy: 0.6047 – 61ms/epoch – 10ms/step
Epoch 235/500
Epoch 235: val_accuracy did not improve from 0.69767
6/6 – 0s – loss: 0.4998 – accuracy: 0.6221 – val_loss: 12.0681 – val_accuracy: 0.6570 – 57ms/epoch – 9ms/step
Epoch 236/500
Epoch 236: val_accuracy did not improve from 0.69767
6/6 – 0s – loss: 0.4847 – accuracy: 0.7093 – val_loss: 12.7811 – val_accuracy: 0.5988 – 53ms/epoch – 9ms/step
Epoch 237/500
Epoch 237: val_accuracy did not improve from 0.69767
6/6 – 0s – loss: 0.4825 – accuracy: 0.7035 – val_loss: 12.3784 – val_accuracy: 0.6279 – 75ms/epoch – 12ms/step
Epoch 238/500
Epoch 238: val_accuracy did not improve from 0.69767
6/6 – 0s – loss: 0.4771 – accuracy: 0.7267 – val_loss: 12.3361 – val_accuracy: 0.5814 – 55ms/epoch – 9ms/step
Epoch 239/500
Epoch 239: val_accuracy did not improve from 0.69767
6/6 – 0s – loss: 0.4811 – accuracy: 0.6919 – val_loss: 11.9446 – val_accuracy: 0.5756 – 60ms/epoch – 10ms/step
Epoch 240/500
Epoch 240: val_accuracy did not improve from 0.69767
6/6 – 0s – loss: 0.4620 – accuracy: 0.7384 – val_loss: 12.3077 – val_accuracy: 0.6105 – 48ms/epoch – 8ms/step
Epoch 241/500
Epoch 241: val_accuracy did not improve from 0.69767
6/6 – 0s – loss: 0.4947 – accuracy: 0.7093 – val_loss: 12.6721 – val_accuracy: 0.5988 – 57ms/epoch – 10ms/step
谢谢 Jason,解释得很棒。
是否可以使用保存的权重通过 model.fit() 再次训练模型?如何操作?
此致
不客气 Understander!以下内容可能有助于澄清
https://machinelearning.org.cn/save-load-keras-deep-learning-models/
谢谢你
你好。谢谢你这篇精彩的博客!
对于图像分类,每个 epoch 花费大约 3 个小时是否正常?我总共有 200 个 epoch,所以训练模型需要 600 个小时。我对每一层都使用了 2,2 步长的最大池化,初始图像大小为 244, 244。
另外,我需要使用云计算,但它一次最多只能免费使用 12 小时。所以一旦超时,我应该重新加载保存的权重,并用减少的 epoch 数量继续训练吗?
你好 HN……你试过 Google Colab 的 GPU 选项吗?
谢谢 Jason,解释得很棒,
1.在“仅检查点最佳神经网络模型”部分,你说模型权重被写入文件“weights.best.hdf5”,但在 ModelCheckpoint 类中你没有设置 save_weights_only = True;这是什么原因?
2. 对于保存,这个字符串:“weights.best.hdf5”是固定的吗?
例如,这个:“version3.weights.best.hdf5”也可以使用吗?
3. 可以使用“weights.best.h5”代替“weights.best.hdf5”吗?
结果一样吗?
你好 understander……不客气!你当然可以使用不同的字符串来表示 .hdf5。
以下讨论可能有助于阐明 .h5 与 .hdf5 的区别
https://stackoverflow.com/questions/51923048/what-is-the-difference-between-these-two-ways-of-saving-keras-machine-learning-m
深度学习中的检查点主要是为了在训练未完成时因故障而中断后恢复训练。
使用 Keras,请参阅此函数,了解在这种情况下能够恢复的简单方法。
https://tensorflowcn.cn/api_docs/python/tf/keras/callbacks/BackupAndRestore