1 回答

TA貢獻2003條經驗 獲得超2個贊
您嘗試構建的損失函數(shù)應具有兩個屬性:
每個非白色像素中的錯誤應該比白色像素有更大的權重
像素越深,誤差應該越大
因此,為了簡單起見,如果您將暗像素分類為白色像素,您希望您的錯誤更多,但實際上并不太擔心將白色像素分類為暗像素但您仍然希望它們有助于您的情況損失函數(shù)。此外,您要確保您的損失與像素的強度成正比(像素越暗,誤差越大)。
我提出了以下遵循這兩個屬性的損失函數(shù):
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出錯。
希望這可以幫助!
添加回答
舉報