Python Keras损失和度量值与每个中的相同函数不匹配
我使用的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
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刚刚包括了这一点。