繁体   English   中英

Keras 损失和指标值与每个中的相同 function 不匹配

[英]Keras loss and metrics values do not match with same function in each

我正在使用 keras 自定义损失 function 如下所示:

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 历史记录中。 作为健全性检查,当 model 完成训练时,我正在使用model.predict(X_val) ,因此我可以使用经过训练的 Z20F35E630DAF44DFA4C3F68F59 使用我的custom_fn手动计算验证损失。

我正在使用此回调以最佳时期保存 model:

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不匹配(无论是loss还是loss_custom_fn都不匹配)。

这真的很奇怪,我的custom_fn本质上是 keras 内置的mape ,对y_truey_pred了轻微操作。 这里发生了什么?

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

更新

甚至删除custom_fn并使用 keras 的内置mape作为损失 function 和如下度量:

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

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

这篇文建议 keras 在计算验证损失时添加训练中使用的任何正则化。 显然,在计算选择的度量时,没有应用正则化。 这就是问题中所述的任何损失 function 选择的原因。

这是我在 Keras 中找不到的任何文档。 但是,它似乎保持不变,因为当我删除所有正则化超参数时, val_lossval_custom_fn在每个时期都完全匹配。

一个简单的解决方法是使用custom_fn作为指标,并根据指标 ( val_custom_fn ) 而不是 val_loss 保存最佳val_loss 否则手动循环每个 epoch,并在训练每个 epoch 后手动计算正确的val_loss 后者似乎更有意义,因为没有理由将custom_fn既作为度量又作为损失 function 包括在内。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM