使用Focal Loss时初始损失值过高的问题排查求助
Focal Loss时初始损失值过高的问题排查求助
大家好,我目前在处理一个高度不平衡的多分类任务,之前了解到TensorFlow里的Focal Loss可以缓解这类问题,于是自己实现了适配稀疏标签的版本,但遇到了一个困惑:模型初始损失依然高达4000-5000左右,和直接用基础的稀疏分类交叉熵损失的初始值差不多。
我已经做了这些准备工作:
- 因为用的是稀疏标签,专门调整了Focal Loss函数,把稀疏标签转成独热编码,并且手动验证过这部分转换是正常工作的
- 损失返回的是每个batch计算出的Focal Loss向量的均值
- 参考二分类的初始偏置方法,给每个类别都设置了初始偏置
下面是我实现的SparseFocalLoss代码:
class SparseFocalLoss(tf.keras.losses.Loss): def __init__(self, gamma = 2.0, alpha = 0.25, from_logits = False, name = "sparse_focal_loss", reduction = tf.keras.losses.Reduction.AUTO): super().__init__(reduction = reduction, name = name) self.gamma = gamma self.alpha = alpha self.from_logits = from_logits def call(self, Y_true, Y_pred): if self.from_logits: Y_pred = tf.nn.softmax(Y_pred, axis = -1) # 获取总类别数 Classes = tf.shape(Y_pred)[-1] # 调整真实标签形状并转成int32 Y_true = tf.cast(tf.reshape(Y_true, [-1]), tf.int32) # 转成独热编码 Y_true_OHE = tf.one_hot(Y_true, depth=Classes) # 调整预测值形状和真实标签一致 Y_pred = tf.reshape(Y_pred, [-1, Classes]) # 裁剪数值避免出现0或1 Y_pred = tf.clip_by_value( t=Y_pred, clip_value_min=1e-12, clip_value_max=1. - 1e-12) # 计算Focal Loss # FL = -a * (1 - Pt)**gamma * log(Pt) Pt = tf.reduce_sum(Y_true_OHE * Y_pred, axis = -1) FL = -1 * self.alpha * tf.pow(1 - Pt, self.gamma) * tf.math.log(Pt) return(tf.reduce_mean(FL, axis = -1))
我已经用笔和纸验证过这个公式的推导是正确的,但实在想不通为什么初始损失和基础损失差不多。有没有朋友能帮我排查一下可能的问题点?
内容来源于stack exchange
相关产品推荐
相关产品推荐

