在训练模型(使用keras)时,当模型具有多个时,val_loss
(如keras训练日志中所示)/ epoch_loss
(如张量板中所示)度量如何测量输出?如果重要的话,这些输出是否也要加权?
我的意思是多个单独的输出(例如6个()
形状的张量),而不是单个输出具有多个值(例如1个(6)
形状的张量)。 (尽管对后者的回答可能对将来的Google员工有用。)
我最初认为这将是所有输出的加权平均值。但是我的观察结果与那个猜测不一致。以下是张量板的屏幕截图,显示了每个输出的验证损失以及epoch_loss
值(也在验证时)。如您所见,在每个输出上损耗都在增加,而epoch_loss
值却在不断减小。
我还确认了这些指标与喀拉拉邦训练日志中显示的val_*
指标(val_1_loss
,val_2_loss
,...,val_loss
)相符。
请注意,我对调查为什么损失增加或修复模型或其他方法的方式不感兴趣。我知道这是一个不好的模型。这只是我从超参数搜索中选出的一个模型,作为该问题的一个很好的例子。
尽管我目前正在使用val_loss
作为超参数搜索优化指标,但根据此数据来看,这似乎不是一个好主意。我可以创建自己的指标来对所有输出进行加权均值,但想了解val_loss
实际在测量什么。
答案 0 :(得分:0)
弄清楚如何强制Tensorflow进入急切模式并连接调试器后,我找到了导致差异的原因。
首先,请使用loss
参数下的keras model.compile()
documentation状态:
该模型将使损失值最小化,它将是所有单个损失的总和。
但是随后loss_weights
参数继续添加:
将由模型最小化的损失值将是所有单个损失的加权总和,并由loss_weights系数加权。
因此,据此,我们应该看到一个简单的加权和。但是正如问题所表明的,事实并非如此。因此,必须考虑其他损失来源。
在我的案例中,答案是来自层损失。
模型中的各个层可以有自己的损耗,可以通过layer.losses()
进行访问。来自这些层的损耗值被汇总为用于优化模型的总损耗,并以val_loss
指标进行报告。
具体来说,我有一个正在使用正则化器的图层,并且正则化器所施加的惩罚被记录为损失。