Keras:model.prediction与model.evaluation损失不匹配

时间:2020-03-26 00:04:50

标签: python tensorflow keras loss-function mse

我在不同的数据集上应用了本教程https://github.com/Hvass-Labs/TensorFlow-Tutorials/blob/master/23_Time-Series-Prediction.ipynb,turorial并未从单个输出中计算均方误差,因此我在比较函数中添加了以下行:

    mean_squared_error(signal_true,signal_pred)

但预测的损失和mse与模型的损失和mse不同。对测试数据的评估。来自model.evaluation(损失,mae,mse)(测试集)的错误:

    [0.013499056920409203, 0.07980187237262726, 0.013792216777801514]

来自单个目标的错误(输出):

    Target0 0.167851388666284
    Target1 0.6068108648555771
    Target2 0.1710370357827747
    Target3 2.747463225418181
    Target4 1.7965991690103074
    Target5 0.9065426398192563 

我认为训练模型可能会出现问题,但我找不到确切的位置。我将衷心感谢您的帮助。

谢谢

2 个答案:

答案 0 :(得分:1)

出于多种原因,您在培训损失和评估损失之间可能会有差异。

  • 某些操作(例如批处理规范化)在预测时被禁用-这与某些体系结构会有很大的不同,尽管通常不应该正确使用批处理规范。
  • 用于训练的MSE在整个时期内平均,而评估仅在模型的最新“最佳”版本上进行。
  • 如果拆分不是随机的,则可能是由于数据集中的差异所致。
  • 您可能会使用不同的指标而没有意识到。

我不确定您遇到了什么问题,但这可能是由许多不同的原因引起的,通常很难调试。

答案 1 :(得分:0)

我遇到了同样的问题,并找到了解决方案。希望这是您遇到的相同问题。

事实证明,model.predict不会以generator.labels的顺序返回预测,这就是为什么当我尝试手动计算时,MSE会大很多(em> (使用scikit-learn指标函数。

>>> model.evaluate(valid_generator, return_dict=True)['mean_squared_error']
13.17293930053711
>>> mean_squared_error(valid_generator.labels, model.predict(valid_generator)[:,0])
91.1225401637833

我的快速而肮脏的解决方案:

valid_generator.reset()  # Necessary for starting from first batch
all_labels = []
all_pred = []
for i in range(len(valid_generator)):  # Necessary for avoiding infinite loop
    x = next(valid_generator)
    pred_i = model.predict(x[0])[:,0]
    labels_i = x[1]
    all_labels.append(labels_i)
    all_pred.append(pred_i)
    print(np.shape(pred_i), np.shape(labels_i))

cat_labels = np.concatenate(all_labels)
cat_pred = np.concatenate(all_pred)

结果:

>>> mean_squared_error(cat_labels, cat_pred)
13.172956865002352

这可以做得更优雅,但足以让我确认问题的假设并恢复理智。