1 回答
TA贡献2003条经验 获得超2个赞
您尝试构建的损失函数应具有两个属性:
每个非白色像素中的错误应该比白色像素有更大的权重
像素越深,误差应该越大
因此,为了简单起见,如果您将暗像素分类为白色像素,您希望您的错误更多,但实际上并不太担心将白色像素分类为暗像素但您仍然希望它们有助于您的情况损失函数。此外,您要确保您的损失与像素的强度成正比(像素越暗,误差越大)。
我提出了以下遵循这两个属性的损失函数:
def custom_loss(y_true, y_pred, coeff):
y_true1, y_pred1 = (255 - y_true) / 255, (255 - y_pred) / 255
dif = y_true1 - y_pred1
temp1 = K.l2_normalize(K.cast(K.greater(dif, 0),"float32")*y_true1,axis=-1) * coeff
temp2 = K.cast(K.less(dif, 0),"float32")
weight = temp1 + temp2
loss = K.abs(weight*dif)
average_loss = K.mean(loss) ##you need to return this when you use in your code
return K.eval(loss)
因此,基本上我们在进行归一化并乘以仅与正值dif(对应于较暗像素)中的正值成比例的权重之后,找到了真实值和预测值之间的差异 - temp1。然后我们只1为对应于负值(对应于白色)的像素添加一个权重。
样本输出
coeff = 5
y_t = np.array([0,250,30,0,255,160,210,0,2,4])
y_p = np.array([50,0,80,10,255,160,210,250,2,80])
custom_loss(y_t,y_p,coeff )
array([0.449957, 0.98039216, 0.39702088, 0.08999141, 0., 0., 0., 2.249785, 0., 0.67320627],dtype=float32)
在这里,如果您仔细查看像素,像素对应于我们将暗像素预测为同时像素的情况,这在我们的情况下非常糟糕,因此损失值非常高2,同样像素对应于我们预测的情况一个白色像素作为一个暗像素,这对我们来说是可以的,所以损失值 没有前一种情况那么高。这对应于 property 。882.24978520.980392161
同样,如果您看像素1,并且3两种情况下的误差幅度相同(它们偏离50),但像素1比像素暗得多3,所以我们希望像素上的误差1高于像素3,这就是我们观察到的在误差向量中。
如果我们的真实值和预测值匹配,我们就会0出错。
希望这可以帮助!
添加回答
举报