我正在使用具有以下自定义损失功能的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_fn
或loss
都不匹配)。
这真的很奇怪,我的loss_custom_fn
本质上是内置于custom_fn
中的keras,其中的mape
和y_true
受到了一些操纵。这是怎么回事?
PS :我正在使用的层是y_pred
层和最后的LSTM
层。但是我认为这些信息与问题无关。我还使用正则化作为超参数,但不使用辍学。
即使删除Dense
并使用custom_fn
内置的keras作为损失函数和度量,如下所示:
mape
为简单起见,删除model.compile(loss='mape', metrics=['mape'])
回调具有相同的效果;每个时期的 ModelCheckpoint
和val_loss
不相等。这对我来说很奇怪。我或者丢失了某些东西,或者Keras代码中存在错误。前者可能更现实。
答案 0 :(得分:2)
此blog post建议keras在计算验证损失时添加训练中使用的任何正则化。显然,在计算选择指标时,不应用任何正则化。这就是为什么问题中所述的任何损失函数都会导致它发生。
这是我在Keras上找不到任何文档的东西。但是,这似乎成立了,因为当我删除所有正则化超参数时,val_loss
和val_custom_fn
在每个时期都完全匹配。
一个简单的解决方法是使用custom_fn
作为度量标准,并根据度量标准(val_custom_fn
)保存最佳模型,而不是val_loss
。否则,手动遍历每个纪元,并在训练每个纪元后手动计算正确的val_loss
。后者似乎更有意义,因为没有理由同时将custom_fn
作为度量和损失函数。
如果任何人都可以在Keras文档中找到任何有帮助的证据。