我有一个回归模型,其中Euclidean
距离为损失函数,RMSE
作为度量评估(越小越好)。当我通过火车时,对model.fit
的测试集我有train_rmse
和test_rmse
,它们的值对我来说很有意义。但是,在加载训练好的模型的权重之后,当我将测试集传递到model.evalute
时,我得到了不同的结果,大约是model.fit
的结果的两倍。从Keras那里我知道火车评估和测试评估之间应该发生的差异:
训练损失是每批训练数据中损失的平均值。由于您的模型会随着时间而变化,因此,前几个时期的损失通常高于最后几个时期的损失。另一方面,一个时期的测试损失是使用模型计算的,因为它处于该时期的末尾,因此损失较低。
但是在这里,我要说的是传递给model.fit的测试集的结果,其中我相信的是对最终模型的评估。在Keras文档中,他们在验证参数上说我正在通过其中的测试集:
validation_data:在每个时期结束时用于评估损失和任何模型指标的数据。该模型将不会根据这些数据进行训练。
搜索问题时,我发现了几个问题
1-像here这样的人报告说,如果他们具有批处理规范化层,或者您确实进行了转移学习并冻结了某些{N}层(如here),则模型本身存在问题。我的模型有BN层,但没有冻结任何层。另外,我对多类分类问题(不是回归模型)使用了相同的模型,并且对于model.fit
和model.evaluate
中的测试集,结果也是相同的。
2-有人喜欢说这与here之类的预测或度量计算有关,他们发现,如果有人为float32,则此差异与y_true和y_pred的dtype的差异有关。例如其他float64,则指标计算将有所不同。当他们统一dtype时,问题就解决了。
我认为最后一种情况适用于我,因为在回归任务中,我的标签现在是tf.float32。我的y_true标签已经通过tf.float32
强制转换为tfrecord
,所以我尝试在tf.float32
计算之前将y_pred强制转换为rmse
,但结果仍然有所不同。
所以我的问题是:
model.fit
结果或model.evalute
上我应该依靠谁进行测试集 更新:
问题在于y_true
和y_pred
之间的形状冲突。至于y_true标签,我将其保存为tfrecords
作为浮点单值,最终将具有[batch_size]
的大小,而回归模型给出的预测为[batch_size, 1]
,然后为{{ tf.subtract(y_true, y_pred)
中的1}}将得出rmse
的矩阵,并以最后一个的平均值为准,您将永远不会猜错,并且代码不会抛出任何错误,而是计算{{ 1}}是错误的。我仍在努力使形状一致,但仍然没有找到好的解决方案。