损失减少从第二个纪元开始



我正在使用Python和Keras和Tensorflow(gpu(。

我训练一个用于图像分类任务的ConvNet。当我训练网络时,我得到训练数据上的损失函数的以下结果:

第一个纪元之前:1.099

第一个纪元之后:1.094

第二个纪元之后:0.899

第三个纪元之后:0.713

第四纪元后:0.620722375

第五个纪元之后:0.532505135

为什么损失函数的递减从第二个纪元开始?为什么第一个纪元之后没有减少?

提前谢谢。

Keras 在训练时计算训练数据的损失。因此,对于第一个纪元,起始样本表现不佳(因为模型尚未训练(,随着训练的进行,模型实际上变得更好,但由于起始样本的不良损失,整体损失看起来很差。

附带说明一下,您可以检查validation loss哪个是在纪元之后计算的,这将更好地指示真实损失。

损失正在减少,但如果不看变量,很难说为什么它在第一个时代几乎没有减少,而后来又减少了更多。模型可能需要一段时间才能找到最小化函数的方法,而在第二个纪元中,优化器可以更好地最小化损失函数。

这是一个容易被忽略的令人困惑的地方,因为它通常不会产生显着的影响。典型的训练循环可能如下所示

import tensorflow as tf
# Build graph
# ...
loss = ...
train_op = ...
with tf.Session() as sess:
    while keep_training:
        _, current_loss = sess.run([train_op, loss], feed_dict={...})
        # ...

问题是,当您在那里调用sess.run时,您会在更新权重之前计算您获得的loss值。 loss是用于优化模型的值,因此对其进行计算,然后反向传播以计算对train_op应用的权重的更新,因此它不可能使用新的权重,因为它首先需要计算这些权重!您可以向train_op后评估的图形添加另一个损失操作,但这需要对每个批次进行两次评估,无论如何,您将在下一次迭代中看到新的损失值。正如我所说,大多数时候这并不重要,但是例如,如果您想找出某些权重在什么时候变得NaN或类似的东西,则可能会产生误导。

最新更新