我正在构建一个深度回归网络(CNN)来从图像(7,11)预测(1000,1)目标向量。目标通常由大约90% 的零和仅10%的非零值组成。目标中(非)零值的分布因样本而异(即不存在全局类别不平衡)。
使用均方误差损失,这导致网络仅预测零,我对此并不感到惊讶。
我最好的猜测是编写一个自定义损失函数,它对非零值的错误的惩罚比对零值的预测的惩罚更多。
我尝试了这个损失函数,目的是实现我猜想的可以在上面工作的功能。它是一种均方误差损失,其中非零目标的预测受到的惩罚较小(w=0.1)。
def my_loss(y_true, y_pred):
# weights true zero predictions less than true nonzero predictions
w = 0.1
y_pred_of_nonzeros = tf.where(tf.equal(y_true, 0), y_pred-y_pred, y_pred)
return K.mean(K.square(y_true-y_pred_of_nonzeros)) + K.mean(K.square(y_true-y_pred))*w
Run Code Online (Sandbox Code Playgroud)
网络能够学习而不会陷入只有零的预测。然而,这个解决方案似乎很不干净。有没有更好的方法来处理此类问题?关于改进自定义损失函数有什么建议吗?欢迎任何建议,先谢谢您!
最好的,卢卡斯