Python Keras损失和度量值与每个中的相同函数不匹配

Python Keras损失和度量值与每个中的相同函数不匹配,python,tensorflow,keras,deep-learning,Python,Tensorflow,Keras,Deep Learning,我使用的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\u fn)和model.fit(X,y,…validation\u data=(X\u val,y\u v

我使用的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\u fn)
model.fit(X,y,…validation\u data=(X\u val,y\u val)

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

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

callbacks.append(ModelCheckpoint(path, save_best_only=True, monitor='val_loss', mode='min'))
因此,在计算该值后,验证损失应与最佳历元的keras’val_损失值相匹配。但这并没有发生

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

    model.compile(loss=custom_fn, metrics=[custom_fn])
令我惊讶的是,
val\u loss
val\u custom\u fn
不匹配(无论是
loss
还是
loss\u custom\u fn

这真的很奇怪,我的
custom\u fn
基本上是内置的
mape
,带有
y\u true
y\u pred
的轻微操纵。这是怎么回事

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

更新 甚至删除
custom_fn
并使用keras内置
mape
作为损失函数和度量,如下所示:

model.compile(loss='mape', metrics=['mape'])
为了简单起见,删除
ModelCheckpoint
回调也有同样的效果
val\u loss
val\u mape
对于每个历元都是不等价的
。这对我来说非常奇怪。我可能遗漏了一些东西,或者Keras代码中存在错误。前者可能更现实。

这表明Keras在计算验证损失时添加了培训中使用的任何正则化。显然,在计算选择的度量时,没有应用正则化。这就是为什么它发生在问题中所述的任何选择损失函数中

这是我从Keras那里找不到的任何文档。然而,当我删除所有正则化超参数时,它似乎成立了,
val_损失
val_自定义
在每个历元中完全匹配

一个简单的解决方法是使用
custom\u fn
作为度量,并根据度量(
val\u custom\u fn
)而不是
val\u loss
保存最佳模型。或者手动循环每个历元,并在训练每个历元后手动计算正确的
val_损失
。后者似乎更有意义,因为没有理由将
custom\u fn
作为度量和损失函数


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

你能报告一下你用来保存最佳模型的回调方法吗?@MarcoCerliani刚刚包括了这一点。