我正在使用Python与Keras和Tensorflow(gpu)。
我为一个图像分类任务训练ConvNet。当我训练网络时,我得到关于训练数据的损失函数的以下结果:
之前第一纪元:1.099
在第一纪元之后:1.094
在第二纪元之后:0.899
在第三纪元之后:0.713
在第四纪元之后:0.620722375
在第五纪元之后:0.532505135
为什么损失函数的减少从第二纪元开始?为什么第一纪元后没有减少?
提前致谢。
答案 0 :(得分:0)
损失正在减少,但很难说没有看到变量为什么它在第一个时期几乎没有减少而后来减少了更多。可能模型需要一段时间才能找到最小化函数的方法,在第二个时期,优化器可以更好地最小化损失函数。
答案 1 :(得分:0)
Keras计算训练时训练数据的损失。因此,对于第一个时期,开始时的样本表现不佳(因为模型尚未训练),随着训练的进行,模型实际上变得更好,但由于起始样本的损失很小,整体损失看起来很差。
在旁注中,您可以查看在时代之后计算的validation loss
,这将是真正损失的更好指标。
答案 2 :(得分:0)
这是一个容易被忽略的混乱位,因为它通常没有明显的影响。典型的训练循环可能看起来像这样
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
或类似的东西,它可能会产生误导。