【发布时间】: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 然后将loss 和val_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_loss 和 val_custom_fn 不匹配(loss 或 loss_custom_fn 都不匹配)。
这真的很奇怪,我的 custom_fn 本质上是 keras 内置的 mape 与 y_true 和 y_pred 稍微操纵。这是怎么回事?
PS:我使用的层是LSTM 层和最后一个Dense 层。但我认为这些信息与问题无关。我也使用正则化作为超参数,但不是 dropout。
更新
即使删除 custom_fn 并使用 keras 内置的 mape 作为损失函数和指标,如下所示:
model.compile(loss='mape', metrics=['mape'])
为简单起见,删除ModelCheckpoint 回调具有相同的效果; 每个时期的val_loss 和val_mape 不等效。这对我来说非常奇怪。我要么遗漏了某些东西,要么 Keras 代码中存在错误..前者可能更现实。
【问题讨论】:
-
能否请您也报告您用于保存最佳模型的回调方法?
-
@MarcoCerliani 现在刚刚包含了。
标签: python tensorflow keras deep-learning