【问题标题】:Tensorflow val_loss definition with multiple outputs具有多个输出的 TensorFlow val_loss 定义
【发布时间】:2020-01-19 02:51:17
【问题描述】:

在训练模型(使用 keras)时,当模型具有多个输出时,val_loss(如 keras 训练日志中所示)/epoch_loss(如 tensorboard 中所示)指标衡量的是什么?如果这很重要,那么这些输出是否也有加权?
我的意思是多个单独的输出(例如 6 个形状 () 的张量),而不是具有多个值的单个输出(例如 1 个形状为 (6) 的张量)。 (虽然后者的答案可能对未来的谷歌人有用。)

我最初认为这将是所有输出的加权平均值。但我的观察与这个猜测不符。下面是张量板的屏幕截图,显示了每个输出的验证损失,以及epoch_loss 值(也在验证中)。如您所见,在每个输出上,损失​​都在增加,而epoch_loss 的值却在不断减小。

我还确认这些指标与 keras 训练日志中显示的 val_* 指标(val_1_lossval_2_loss、...、val_loss)相匹配。

请注意,我对调查损失增加的原因或修复模型的方法或任何事情不感兴趣。我知道这是一个糟糕的模型。这只是我选择的超参数搜索中的一个模型,作为该问题的一个很好的例子。 虽然我目前使用val_loss 作为超参数搜索优化指标,但从这些数据来看,这似乎不是一个好主意。我可以创建自己的指标来对所有输出进行加权平均,但想了解 val_loss 实际测量的是什么。

【问题讨论】:

  • 您确定“epoch_N_loss”图实际上是损失图吗?如果是这样,您的模型看起来正在发散(损失增加?)。您能否阐明这些图是如何生成的以及它们究竟包含什么?
  • 是的。我的意思是除非 tensorflow/keras 内部正在做其他事情。我已经用loss='mean_squared_error' 配置了模型。张量板屏幕截图中的值与详细训练日志中的输出相匹配。这些图是由张量板回调使用配置的损失指标自动生成的(它会自动为模型的每个输出创建一个单独的图)。
  • 你确定,每个纪元的日志记录都完成了,而不是一个纪元的每批都记录吗?
  • 是的。特别是因为这些是验证指标,并且验证只发生在 epoch 结束时。

标签: python tensorflow keras


【解决方案1】:

当模型有多个输出时,val_loss / epoch_loss 指标测量什么? 如果它很重要,那么这些输出是否也有加权?

使用loss_weights 系数将损失值计算为多个输出的损失的加权和。当没有定义权重时,损失只是损失的总和。

以下是代码中的引用:

【讨论】:

    【解决方案2】:

    在弄清楚如何强制 Tensorflow 进入 Eager 模式并附加调试器后,我找到了差异的原因。

    首先,keras model.compile() documentationloss 参数下声明:

    模型将最小化的损失值将是所有单个损失的总和。

    但随后loss_weights 参数继续添加:

    模型将最小化的损失值将是所有单个损失的加权总和,由 loss_weights 系数加权。

    所以根据这个,我们应该看到一个简单的加权和。但正如问题中所证明的那样,情况并非如此。所以必须考虑另一个损失来源。

    我的答案是层损失。
    模型中的各个层可以有自己的损失,可以通过layer.losses() 访问。这些层的损失值被汇总到用于优化模型的总损失中,并在val_loss 指标中报告。
    具体来说,我有一个使用正则化器的层,并且正则化器应用的惩罚被跟踪为损失。

    【讨论】:

      猜你喜欢
      • 2020-01-21
      • 2021-06-14
      • 1970-01-01
      • 2019-05-05
      • 1970-01-01
      • 2021-08-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多