Keras损失和指标值与每个函数的功能都不匹配

时间:2020-08-18 08:42:29

标签: python tensorflow keras deep-learning

我正在使用具有以下自定义损失功能的keras:

    VStack{
        AnimatedImage(url: URL(string: self.mediaLink))
            .resizable()
            .scaledToFill()
            .frame(width: UIScreen.main.bounds.width - 40)
            .clipped()
    }
    .frame(width: UIScreen.main.bounds.width - 40)

然后我正在呼叫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)

Keras随后将model.fit(X, y,..validation_data=(X_val, y_val)..)loss保存在模型历史记录中。为了进行健全性检查,当模型完成训练后,我使用的是val_loss,因此我可以使用训练后的模型用model.predict(X_val)手动计算验证损失。

我使用此回调保存具有最佳时期的模型:

custom_fn

因此,计算完此后,验证损失应与最佳时期的keras的callbacks.append(ModelCheckpoint(path, save_best_only=True, monitor='val_loss', mode='min')) 值匹配。但这没有发生。

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

val_loss

令我惊讶的是, model.compile(loss=custom_fn, metrics=[custom_fn]) val_loss不匹配(val_custom_fnloss都不匹配)。

这真的很奇怪,我的loss_custom_fn本质上是内置于custom_fn中的keras,其中的mapey_true受到了一些操纵。这是怎么回事?

PS :我正在使用的层是y_pred层和最后的LSTM层。但是我认为这些信息与问题无关。我还使用正则化作为超参数,但不使用辍学。

更新

即使删除Dense并使用custom_fn内置的keras作为损失函数和度量,如下所示:

mape

为简单起见,删除model.compile(loss='mape', metrics=['mape']) 回调具有相同的效果;每个时期的 ModelCheckpointval_loss不相等。这对我来说很奇怪。我或者丢失了某些东西,或者Keras代码中存在错误。前者可能更现实。

1 个答案:

答案 0 :(得分:2)

blog post建议keras在计算验证损失时添加训练中使用的任何正则化。显然,在计算选择指标时,不应用任何正则化。这就是为什么问题中所述的任何损失函数都会导致它发生。

这是我在Keras上找不到任何文档的东西。但是,这似乎成立了,因为当我删除所有正则化超参数时,val_lossval_custom_fn在每个时期都完全匹配。

一个简单的解决方法是使用custom_fn作为度量标准,并根据度量标准(val_custom_fn)保存最佳模型,而不是val_loss。否则,手动遍历每个纪元,并在训练每个纪元后手动计算正确的val_loss。后者似乎更有意义,因为没有理由同时将custom_fn作为度量和损失函数。

如果任何人都可以在Keras文档中找到任何有帮助的证据。