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

spi*_*der 9 machine-learning deep-learning keras

像这样:

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)
Run Code Online (Sandbox Code Playgroud)

结果:

Train on 10 samples, validate on 10 samples
Epoch 1/1
10/10 [==============================] - 27s 3s/step - loss: 0.4482 - val_loss: 0.4389
Run Code Online (Sandbox Code Playgroud)

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

Kir*_*iru 7

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

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

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

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


归档时间:

查看次数:

2714 次

最近记录:

7 年,9 月 前