![](/img/trans.png)
[英]Log Keras metrics for each batch as per Keras example for the loss
[英]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 将loss
和val_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_loss
和val_custom_fn
不匹配(无论是loss
还是loss_custom_fn
都不匹配)。
这真的很奇怪,我的custom_fn
本质上是 keras 内置的mape
,对y_true
和y_pred
了轻微操作。 这里发生了什么?
PS :我使用的层是LSTM
层和最终的Dense
层。 但我认为这些信息与问题无关。 我也使用正则化作为超参数,但不使用 dropout。
甚至删除custom_fn
并使用 keras 的内置mape
作为损失 function 和如下度量:
model.compile(loss='mape', metrics=['mape'])
为简单起见,删除ModelCheckpoint
回调具有相同的效果; 每个 epoch 的val_loss
和val_mape
是不等价的。 这对我来说非常奇怪。 我要么遗漏了一些东西,要么 Keras 代码中存在错误..前者可能更现实。
这篇博文建议 keras 在计算验证损失时添加训练中使用的任何正则化。 显然,在计算选择的度量时,没有应用正则化。 这就是问题中所述的任何损失 function 选择的原因。
这是我在 Keras 中找不到的任何文档。 但是,它似乎保持不变,因为当我删除所有正则化超参数时, val_loss
和val_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.