Neural network keras损失在新纪元开始时随机跳至零

Neural network keras损失在新纪元开始时随机跳至零,neural-network,keras,training-data,gradient-descent,Neural Network,Keras,Training Data,Gradient Descent,我正在训练一个网络,它有多个损耗,并且使用生成器创建数据并将数据馈送到我的网络中 我已经检查了数据的结构,它看起来总体上很好,而且在大多数情况下,它的训练也与预期的差不多,但是在几乎每次随机的历元中,每次预测的训练损失都会突然从假设中跳出来 # End of epoch 3 loss: 2.8845 到 我认为可能是数据,但是,从我所能说的来看,数据通常是好的,它甚至更可疑,因为这将发生在一个随机的时期(可能是因为在SGD期间选择了一个随机的数据点?),但会持续到训练的其余部分。如同在第3个

我正在训练一个网络,它有多个损耗,并且使用生成器创建数据并将数据馈送到我的网络中

我已经检查了数据的结构,它看起来总体上很好,而且在大多数情况下,它的训练也与预期的差不多,但是在几乎每次随机的历元中,每次预测的训练损失都会突然从假设中跳出来

# End of epoch 3
loss: 2.8845 

我认为可能是数据,但是,从我所能说的来看,数据通常是好的,它甚至更可疑,因为这将发生在一个随机的时期(可能是因为在SGD期间选择了一个随机的数据点?),但会持续到训练的其余部分。如同在第3个历元,训练损失减少到
1.1921e-07
,然后在第4个历元、第5个历元等继续这样

然而,有时当它到达第五纪元时,还没有这样做,然后可能在第六纪元或第七纪元这样做

除了数据之外,是否有任何可行的原因可能导致这种情况?有没有可能是一些模糊的数据点导致了如此之快的速度

谢谢

编辑:

结果:

300/300 [==============================] - 339s - loss: 3.2912 - loss_1: 1.8683 - loss_2: 9.1352 - loss_3: 5.9845 - 
val_loss: 1.1921e-07 - val_loss_1: 1.1921e-07 - val_loss_2: 1.1921e-07 - val_loss_3: 1.1921e-07

这之后的下一个时期都有训练损失1.1921e-07

不完全确定这是一个多么令人满意的答案,但我的发现似乎表明,将多个分类交叉熵损失一起使用似乎会导致一个超不稳定的网络?将其替换为其他损失函数可以解决数据保持不变的问题。

Keras将损失显示为当前历元的平均值。这意味着,如果优化器在损失场景中找到一个“悬崖”,它将在下一个时代开始之前不明显。也可能是在某个时刻,你的模型很好地预测了一个时代的第一批。您可以尝试在每个历元中洗牌数据。如果不查看一些代码,很难说它是对的还是错的。无论如何,如果您还没有使用验证集,我会鼓励您使用它。@ManoloSantos我明白了,谢谢您的洞察力。所以你的意思是,如果它只是不断地发现“坏数据”,例如空数据(我觉得它必须这样才能在所有预测中产生零损失),那么损失可能会迅速减少。我目前正在从数据集中随机生成数据,所以预测的顺序应该不会有问题?我会做进一步的测试,让你知道。损失接近0,并不意味着你有“坏数据”,它意味着模型非常有信心预测你的数据。(这可能意味着它是过度拟合和记忆,这就是为什么我建议你使用验证集,以放弃这种可能性)。@ManoloSantos啊,当然,我只是说“坏数据”,因为从这个特定项目的经验来看,零的损失将意味着一个相当难以置信的发现…@ManoloSantos Hi Manalos。我使用了一个验证集进行检查,结果在编辑中。奇怪的是,在训练达到零之前,它就被预测为零,所以这看起来很奇怪。此外,在这一时期之后,所有训练损失突然与验证集出现相同的错误。事后看来,这可能是由于可能性值太小或太大,可能会出现NaN,因此更适当地剪裁这些值可能会有所帮助。
300/300 [==============================] - 339s - loss: 3.2912 - loss_1: 1.8683 - loss_2: 9.1352 - loss_3: 5.9845 - 
val_loss: 1.1921e-07 - val_loss_1: 1.1921e-07 - val_loss_2: 1.1921e-07 - val_loss_3: 1.1921e-07