【问题标题】:Why val_loss is different from training loss when use the same training data as validation data?当使用相同的训练数据作为验证数据时,为什么 val_loss 与训练损失不同?
【发布时间】:2018-03-08 04:17:24
【问题描述】:

就像这样:

x = keras.layers.Input(shape=(3,))
y = keras.layers.Dense(5)(x)

G = keras.models.Model(x, y,name='G')
G.compile(optimizer='rmsprop', loss='mse')

data_x = np.random.random((10, 3))
data_y = np.random.random((10, 5))

G.fit(data_x,data_y,shuffle=False,validation_data=[data_x,data_y],verbose=1)

结果:

Train on 10 samples, validate on 10 samples
Epoch 1/1
10/10 [==============================] - 27s 3s/step - loss: 0.4482 - val_loss: 0.4389

打印的损失和 val_loss 不同。在其他一些测试中,我发现差异很大。为什么?

【问题讨论】:

标签: machine-learning keras deep-learning


【解决方案1】:

还有一些其他原因可能导致观察到的值存在差异:

  1. 根据我对this 问题的回答,显示的训练损失是在优化之前计算的。因此,在您只对单个批次进行训练的情况下,在训练和验证损失评估之间仍然存在一个优化步骤。

  2. 有些层在训练阶段/测试阶段表现不同,例如 BatchNormalization 层或 Dropout 层,如 Keras FAQ 中所述。如果您点击链接,还有一个代码示例如何获取两个阶段中的任何一个的模型输出(不应用在调用 model.fitmodel.train_on_batch 等方法时应用的优化)

  3. 这是为了完整性,尽管差异会比您展示的要小得多。当使用 GPU 时,有些方法可能会不确定地执行。多次执行相同的操作时,这可能会显示出轻微的数值差异,尽管我不确定这是否会成为您的具体计算中的问题。 例如参考this有关Tensorflow的问题的答案,或this有关Theano的评论。

【讨论】:

  • 是的,BN层导致training loss和val loss有显着差异。
【解决方案2】:

Loss 是一个在训练 epoch 时“动态”计算的数字。因此,并不是很准确。另一方面,val_loss 是在 epoch 结束时计算的。有时,您可以在从上一个 epoch 结束到下一个 epoch 开始的跳跃损失值中看到这种行为。所以行为不是很好,但很正常。

如果您想要比较真实的损失与 val_loss,您应该写一个 custom callback 并自己计算。

【讨论】:

    【解决方案3】:

    您在进度栏中看到的训练损失是训练批次损失的平均值。由于模型在训练过程中不断适应和变化,这个数字只是一个指标,并不是真正的损失值。

    验证损失是在一个时期结束时计算的,而模型是恒定的。这是主要的不同,因为即使您使用相同的数据,这两个值也不相同。

    【讨论】:

    • 如果用整个数据量只训练一个epoch,平均训练loss和一个batch一样,val loss是在一个epoch结束时计算的,所以应该是一样的作为训练损失?但在上面的测试中,它不是。
    • @spider 你的意思是批量大小等于整个数据集?
    • @Matias Valdenegro 是的。我发现问题是训练损失是在网络优化之前计算的,而验证损失是在网络优化之后计算的。
    • @MatiasValdenegro 如果您设置了validation_split 参数会怎样?比一部分数据被排除在训练之外并且仅用于验证(每个时期的验证数据相同)对吗?
    【解决方案4】:

    不同之处在于,验证损失是在整个 epoch 的梯度下降之后计算的,而训练损失是在这个特定示例的梯度下降之前计算的。如果你实际上收敛了两个损失应该是相同的。您可以通过将学习率设置为像 1E-10 这样非常小的值并检查损失是否相似(例如差异小于 10E-6)来测试这一点。

    【讨论】:

      猜你喜欢
      • 2019-11-29
      • 2019-10-08
      • 2022-06-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-04-02
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多