【问题标题】:Keras loss and metrics values do not match with same function in eachKeras 损失和指标值与每个函数中的相同函数不匹配
【发布时间】:2024-01-24 04:39:01
【问题描述】:

我正在使用带有自定义损失函数的 keras,如下所示:

def custom_fn(y_true, y_pred):
   # changing y_true, y_pred values systematically
   return mean_absolute_percentage_error(y_true, y_pred)
   

然后我打电话给model.compile(loss=custom_fn)model.fit(X, y,..validation_data=(X_val, y_val)..)

Keras 然后将lossval_loss 保存在模型历史记录中。作为健全性检查,当模型完成训练时,我使用的是 model.predict(X_val),因此我可以使用训练后的模型使用我的 custom_fn 手动计算验证损失。

我正在使用此回调保存具有最佳时期的模型:

callbacks.append(ModelCheckpoint(path, save_best_only=True, monitor='val_loss', mode='min'))

所以在计算完这个之后,验证损失应该匹配 keras 的 val_loss 最佳时期的值。但这并没有发生。

作为解决这个问题的另一个尝试,我也在这样做:

    model.compile(loss=custom_fn, metrics=[custom_fn])

令我惊讶的是,val_lossval_custom_fn 不匹配(lossloss_custom_fn 都不匹配)。

这真的很奇怪,我的 custom_fn 本质上是 keras 内置的 mapey_truey_pred 稍微操纵。这是怎么回事?

PS:我使用的层是LSTM 层和最后一个Dense 层。但我认为这些信息与问题无关。我也使用正则化作为超参数,但不是 dropout。

更新

即使删除 custom_fn 并使用 keras 内置的 mape 作为损失函数和指标,如下所示:

model.compile(loss='mape', metrics=['mape'])

为简单起见,删除ModelCheckpoint 回调具有相同的效果; 每个时期的val_lossval_mape 不等效。这对我来说非常奇怪。我要么遗漏了某些东西,要么 Keras 代码中存在错误..前者可能更现实。

【问题讨论】:

  • 能否请您也报告您用于保存最佳模型的回调方法?
  • @MarcoCerliani 现在刚刚包含了。

标签: python tensorflow keras deep-learning


【解决方案1】:

blog post 建议 keras 在计算验证损失时添加训练中使用的任何正则化。显然,在计算选择的度量时,没有应用正则化。这就是为什么它出现在问题中所述的任何选择的损失函数中。

这是我无法从 Keras 找到的任何文档。但是,自从我删除所有正则化超参数后,它似乎一直保持不变,val_lossval_custom_fn 在每个时期都完全匹配。

一个简单的解决方法是使用 custom_fn 作为指标,并根据指标 (val_custom_fn) 而非 val_loss 保存最佳模型。或者手动遍历每个 epoch 并在训练每个 epoch 后手动计算正确的val_loss。后者似乎更有意义,因为没有理由将 custom_fn 既作为指标又作为损失函数。

如果有人能在 Keras 文档中找到这方面的任何证据,那将是有帮助的。

【讨论】:

    最近更新 更多