【问题标题】:Validation loss is zero on first epoch only仅在第一个 epoch 验证损失为零
【发布时间】:2020-03-27 04:55:15
【问题描述】:

问题

我正在尝试使用数据集和 keras API 在 tensorflow 中构建回归模型。目标包含相当多的零,非零值大致正态分布,尽管都是正数。

当我尝试创建下面的线性模型时,我注意到在第一个时期,验证损失和两个验证指标都为 0,尽管训练损失和指标不是。这个问题在第一个 epoch 之后就消失了。尽管这并不能阻止我创建模型,但我仍然无法解释为什么会发生这种情况以及我可能会做些什么。

到目前为止尝试过

我没有成功地试图找出问题所在:

  • 交换traintest
  • 更小的批量大小(32 而不是 255)
  • 洗牌test
  • 将密集层的初始化器设置为正常

我的代码

train = tf.data.experimental.make_csv_dataset(...)
test = tf.data.experimental.make_csv_dataset(...) # a smaller csv file

model = Sequential([
    DenseFeatures(features),
    Dense(1, activation='linear') # we are doing a regression
])
model.compile(
    optimizer='adam',
    loss='mean_squared_error',
    metrics=['mean_squared_error', 'mean_absolute_error']
)
model.fit(train,
          epochs=2, 
          validation_data=test
)

【问题讨论】:

  • 似乎是一个报告(而不是计算)问题 - 当我添加回调时,我的 on_epoch_end 得到非零损失:

标签: python tensorflow deep-learning tensorflow-datasets tf.keras


【解决方案1】:

这是完全正常的,因为正常指标和验证指标是在不同时间计算的。

在 epoch 期间计算常规指标,因此您可以看到损失分数和其他来自训练的值。

验证指标用于查看在某个时期计算的参数是否良好。这意味着在特定时期使用的一些训练数据(您可以指定百分比)不用于训练,而是用于计算网络精度。因此,当您有特定的参数配置时,这些值是在 epoch 结束时计算的。

【讨论】:

  • 我不确定为什么在 epoch 结束时验证损失正好是 0.0 是有意义的。
  • 因为验证是训练后的一个步骤。管道是这样的:你训练网络,但你不知道它是否好用,然后你对网络从未见过的数据进行验证。在此步骤中,将计算验证损失,因此仅在训练时期之后。
  • 我了解如何计算验证损失,但不了解为什么它始终为 0.0 而不是某个有限的正值。这可能是一个错误吗?
  • 问题确实只出现在第一个epoch。
  • 不幸的是我没有。由于这个问题不会影响最终性能,我决定放弃它。
猜你喜欢
  • 2018-03-03
  • 1970-01-01
  • 2022-01-10
  • 2022-11-15
  • 2016-09-29
  • 2020-10-08
  • 2020-11-04
  • 2021-04-13
  • 2019-08-14
相关资源
最近更新 更多