我正在使用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
或类似的东西,则可能会产生误导。