如何在 keras 网络中正确定义获取图像并输出图像的损失函数?

我正在尝试构建一个模型,该模型采用灰度图像并使用 keras 生成另一个图像作为残差 CNN 的输出。这里的关键思想是非白色像素的数量远小于白色像素的数量。因此,每个非白色像素中的误差在损失函数中的权重应该比白色像素中的更大。像素越暗,误差应该越大。这就是我目前所做的。这里,total_pred_score 表示所有正确猜测的像素,其权重由某个 int 系数定义,total_true_score 表示训练集中所有图像和像素的总预期得分。但我不确定它是否正确。你能帮帮我吗?


def custom_loss(y_true, y_pred):

    y_true1, y_pred1 = (255 - y_true) / 255, (255 - y_pred) / 255

    dif = (1 - K.abs(y_true1 - y_pred1))

    weight = (coeff - 1) * y_true1 + 1 

    total_true_score = K.sum(weight, axis = [0,1,2,3])

    total_pred_score = K.sum(multiply([dif,weight]), axis = [0,1,2,3])

    return K.abs(total_true_score - total_pred_score) / total_true_score


qq_花开花谢_0
浏览 152回答 1
1回答

湖上湖

您尝试构建的损失函数应具有两个属性:每个非白色像素中的错误应该比白色像素有更大的权重像素越深,误差应该越大因此,为了简单起见,如果您将暗像素分类为白色像素,您希望您的错误更多,但实际上并不太担心将白色像素分类为暗像素但您仍然希望它们有助于您的情况损失函数。此外,您要确保您的损失与像素的强度成正比(像素越暗,误差越大)。我提出了以下遵循这两个属性的损失函数: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 = 5y_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出错。希望这可以帮助!
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python