如何创建由骰子损失和焦点损失组成的混合损失 [Python]

问题描述

我正在尝试在 Python 中实现 Multiclass Hybrid loss 函数,该函数来自以下文章 https://arxiv.org/pdf/1808.05238.pdf,用于解决我使用不平衡数据集的语义分割问题。我设法让我的实现足够正确,可以在训练模型时开始,但结果很差。模型架构 - U-netAdam 优化器中的学习率为 1e-5。面具形状是 (None,512,3),有 3 个类(在我的例子中是森林、森林砍伐、其他)。我用来实现我的损失的公式:

enter image description here

我创建的代码:

def build_hybrid_loss(_lambda_=1,_alpha_=0.5,_beta_=0.5,smooth=1e-6):
    def hybrid_loss(y_true,y_pred):
        C = 3
        tversky = 0
        # Calculate Tversky Loss
        for index in range(C):
            inputs_fl = tf.nest.flatten(y_pred[...,index])
            targets_fl = tf.nest.flatten(y_true[...,index])
        
            #True Positives,False Positives & False Negatives
            TP = tf.reduce_sum(tf.math.multiply(inputs_fl,targets_fl))
            FP = tf.reduce_sum(tf.math.multiply(inputs_fl,1-targets_fl[0]))
            FN = tf.reduce_sum(tf.math.multiply(1-inputs_fl[0],targets_fl))
           
            tversky_i = (TP + smooth) / (TP + _alpha_ * FP + _beta_ * FN + smooth)  
            tversky += tversky_i
        tversky += C
        
        # Calculate Focal loss
        loss_focal = 0
        for index in range(C):
            f_loss = - (y_true[...,index] * (1 - y_pred[...,index])**2 * tf.math.log(y_pred[...,index]))
            # Average over each data point/image in batch
            axis_to_reduce = range(1,3)
            f_loss = tf.math.reduce_mean(f_loss,axis=axis_to_reduce)
            loss_focal += f_loss
            
        result = tversky + _lambda_ * loss_focal
        return result
    return hybrid_loss

模型在epoch结束后的预测(我有交换颜色的问题,所以预测中的红色实际上是绿色的,这意味着森林,所以预测主要是森林而不是森林砍伐):

enter image description here

问题是我的混合损失实现有什么问题,需要进行哪些更改才能使其正常工作?

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)