在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))
我最后得到了这个:
Epoch 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)))
我得到1.4587而不是1.5213。
为什么他们不一样?为什么我没有得到model.fit()计算的1.5213?我在这里错过了什么吗? model.fit()不通过整个验证集吗?
答案 0 :(得分:1)
在分析了这种情况后,我想我知道你为什么会遇到这种情况。根据您在纪元200
上的输出结果来判断,我们可以看到当时的模型指标是:
损失: 1.2060 - acc: 0.5168 - val_loss: 1.5213 - val_acc: 0.5294
这意味着在最后一个时期,您正在训练的前馈模型失去了1.2060
(以及1.5213
的验证之一)。
然而,训练算法仍然必须反向传播最终损失以更新模型权重。只有在迭代输入之后,然后计算指标,最后反向传播权重,才会认为纪元是“结束”。任何其他时期都会继续相同的过程。
这就是为什么当你在最后一个时期之后进行评估时会得到不同的损失,因为你的模型在最后一次反向传播后更新了一点,学习比上一步更多。这也可以解释为什么你在纪元200
之后获得了较低的损失值,因为你的模型还有一个成功训练的时代。
答案 1 :(得分:0)
可能有两个原因:
mse
则假定输出和目标输出是缩放器。它仍然适用于矢量,但值不可靠。 batch_size
2000,而在预测期间,batch_size
为1.尝试model.predict(Xval,batch_size=256)
。这将确保两者的条件相同。