当使用与验证数据相同的训练数据时,为什么val_loss与训练损失不同?

时间:2018-03-08 04:17:25

标签: machine-learning keras deep-learning

就像这样:

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不同。在其他一些测试中,我发现差异很大。为什么呢?

4 个答案:

答案 0 :(得分:3)

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

  1. 根据this我的问题的答案,显示的训练损失在优化之前计算。因此,当您只对单个批次进行培训时,仍然会在培训和验证损失评估之间应用优化步骤。

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

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

答案 1 :(得分:1)

损失是一个即时计算的数字'在训练时代的同时。因此,并不是真的准确。另一方面,Val_loss在时代结束时计算。有时您可以在从上一个纪元结束到下一个纪元开始的跳跃损失值中看到此行为。所以行为不好,但很正常。

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

答案 2 :(得分:0)

您在进度条中看到的培训损失是培训批次的平均损失。由于模型在培训期间不断适应和变化,这个数字只是一个指标,而不是真正的损失价值。

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

答案 3 :(得分:0)

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