【问题标题】:loss decrease starts from second epoch [closed]损失减少从第二个时代开始[关闭]
【发布时间】:2018-06-25 01:12:39
【问题描述】:

我将 Python 与 Keras 和 Tensorflow (gpu) 结合使用。

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

之前第一个纪元:1.099

第一个纪元之后:1.094

第二个纪元之后:0.899

第三个纪元之后:0.713

第四个纪元之后:0.620722375

第五个纪元之后:0.532505135

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

提前致谢。

【问题讨论】:

  • 1.094 小于 1.099,所以有下降。什么意思?
  • 我猜它才刚刚开始四处寻找最小值。

标签: tensorflow machine-learning neural-network deep-learning keras


【解决方案1】:

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

在旁注中,您可以检查validation loss,它是在 epoch 之后计算的,这将更好地指示真实损失。

【讨论】:

    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

      这是一个容易被忽略的令人困惑的部分,因为它通常不会产生显着的影响。一个典型的训练循环可能看起来像这样

      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 或类似的东西,这可能会产生误导。

      【讨论】:

        猜你喜欢
        • 2018-07-09
        • 1970-01-01
        • 2017-11-28
        • 2021-02-24
        • 1970-01-01
        • 2018-12-15
        • 2021-04-13
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多