【问题标题】:Why is a Keras custom metric not called after each epoch? [SOLVED]为什么每个 epoch 后不调用 Keras 自定义指标? [解决了]
【发布时间】:2021-03-06 04:35:24
【问题描述】:

我正在使用 tensorflow 2.1 和 tf.keras,无论是添加自定义指标作为简单函数还是指标子类实例,在训练期间,自定义指标只会在训练开始时调用,而不是在每个 epoch 之后调用期待。例如,运行的开始如下(比通常的测试大得多的验证段),其中度量在update_state()result() 期间打印,但只到 epoch 1。在这种情况下,度量返回一个虚拟数字每次更新调用都会增加,达到 2 并且不再进一步。提供的指标,如 BinaryAccuracy do 在每个时期后都会产生不同的数字,所以我认为我遗漏或误解了某些东西。观察到的行为有什么解释?

update
result
Train on 4418 samples, validate on 4418 samples
Epoch 1/120
update
result
result
3800/4418 [========================>.....] - ETA: 0s - loss: 0.1597 - binary_true_positives: 2.0000 result
4418/4418 [==============================] - 3s 622us/sample - loss: 0.1500 - binary_true_positives: 2.0000 - val_loss: 0.0986 - val_binary_true_positives: 2.0000
Epoch 2/120
4418/4418 [==============================] - 0s 89us/sample - loss: 0.0868 - binary_true_positives: 2.0000 - val_loss: 0.0643 - val_binary_true_positives: 2.0000

已解决:进一步观察后,自定义指标在每个 epoch 后按预期生成,只是生成它们的 Python 代码没有被执行。我突然意识到,代码很可能已转换为 TensorFlow 图(可在 TensorBoard 中查看),并且指标是通过执行编译后的图而不是导致生成图表示的原始 Python 代码生成的。

【问题讨论】:

  • 你能分享你正在使用的代码吗?如果我们有一个可以自己运行的示例(可以是虚拟的 1 层模型,虚拟数据),那就容易多了。
  • 谢谢 代码是更大系统的一部分,不是独立的,所以我会看一个最小的测试用例并在之后更新。
  • @ibarrond 再次感谢。发现 TensorFlow 图形执行将是解释。
  • 您仍然可以回答自己的问题并获得积分,它可以帮助其他人!至少简要解释一下你是如何解决它的
  • 如果您想在每次评估度量“图表”时打印一些内容,您可以添加 tf.print() 而不是 print(),因为 tf.print() 是模型/拟合图中的操作

标签: tensorflow keras


【解决方案1】:

因为在每个 epoch 之后事情都不会改变。训练样本和验证是相同的,不会随着迭代而改变。

【讨论】:

  • 谢谢。验证数据必然相同,但是随着模型的发展,模型所做的预测会在每个 epoch 之后发生变化。由于 Metrics 用于评估模型性能,这会随着一个时期的变化而变化,所以这些指标是否需要在每个训练时期结束时应用于一组新的验证数据预测?
  • 样本数相同。最后在测试时进行预测。在每个 epoch 中进行训练和验证。
  • 我相信我发现了问题并相应地更新了问题。
猜你喜欢
  • 1970-01-01
  • 2021-12-08
  • 2021-06-01
  • 2018-11-07
  • 2018-05-14
  • 2012-10-09
  • 2021-01-17
  • 2021-10-15
  • 1970-01-01
相关资源
最近更新 更多