来自 model.fit() 的 Keras 验证损失不期望

sam*_*mjk 4 deep-learning keras

在 Keras 中使用 model.fit() 训练我的网络,在 model.compile() 中使用 loss='mean_squared_error':

model.compile(loss='mean_squared_error', optimizer=optimizers.Adam(decay=0.00001), metrics=['accuracy'])
hist=model.fit(X, Y, epochs=200, batch_size=2000,  verbose=2, shuffle="batch", validation_data=(Xval,Yval))
Run Code Online (Sandbox Code Playgroud)

我最后得到了这个:

纪元 200/200 23s - 损失:1.2060 - acc:0.5168 - val_loss:1.5213 - val_acc:0.5294

现在,如果我手动检查验证集的损失

pre=model.predict(Xval)
print(np.mean(np.square(pre-Yval)))
Run Code Online (Sandbox Code Playgroud)

我得到 1.4587 而不是 1.5213。

他们为什么不同?为什么我没有得到由 model.fit() 计算的 1.5213?我在这里错过了什么吗?model.fit() 不通过整个验证集吗?

Dar*_*nus 5

在分析了这种情况后,我想我知道您为什么会遇到这种情况。通过你在你划时代的输出来看200,我们可以看到,在你的模型度量那一刻是:

损失: 1.2060 - acc: 0.5168 - val_loss: 1.5213 - val_acc: 0.5294

这意味着在最后一个 epoch 中,您正在训练的前馈模型获得了 的损失1.2060(并且验证了1.5213)。

但是,训练算法仍然必须反向传播最终损失以更新模型权重。只有在迭代输入,然后计算指标,最后反向传播权重之后,才认为一个时代“结束”。对于任何其他时期,相同的过程将继续。

这就是为什么在最后一个 epoch 之后进行评估时会得到不同损失的原因,因为在最后一次反向传播更新模型后,您的模型发生了一些变化,比上一步学到了更多。这也可以解释为什么您在 epoch 之后获得了较低的损失值200,因为您的模型还有一个成功训练的 epoch。


Sha*_*ani 0

可能有两个原因:

  1. 网络的输出是一个向量,同时mse假设输出和目标输出是缩放器。它仍然适用于向量,但值不可靠。
  2. batch_size在训练期间使用了 2000,而在预测期间batch_size使用了 1。尝试model.predict(Xval,batch_size=256)。这将确保两者的条件相同。