问题描述
我正在尝试在 Python 中实现 Multiclass Hybrid loss 函数,该函数来自以下文章 https://arxiv.org/pdf/1808.05238.pdf,用于解决我使用不平衡数据集的语义分割问题。我设法让我的实现足够正确,可以在训练模型时开始,但结果很差。模型架构 - U-net,Adam 优化器中的学习率为 1e-5。面具形状是 (None,512,3),有 3 个类(在我的例子中是森林、森林砍伐、其他)。我用来实现我的损失的公式:
我创建的代码:
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结束后的预测(我有交换颜色的问题,所以预测中的红色实际上是绿色的,这意味着森林,所以预测主要是森林而不是森林砍伐):
问题是我的混合损失实现有什么问题,需要进行哪些更改才能使其正常工作?
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)