【深度学习实战(22)】解决分类不均衡问题之Focal Loss

一、Focal Loss公式介绍

Focal loss是何恺明大神提出的一种新的loss计算方案。其具有两个重要的特点。

1、控制正负样本的权重

2、控制容易分类和难分类样本的权重

论文:

二分类问题交叉熵损失

公式:

我们可以利用如下Pt简化交叉熵loss。

此时:

代码:

cpp 复制代码
BCE_loss = F.binary_cross_entropy_with_logits(inputs, targets, reduction='none')

正负样本平衡项

-想要降低负样本的影响,可以在常规的损失函数前增加一个系数αt。与Pt类似,当label=1的时候,αt=α;当label=otherwise的时候,αt=1 - α,a的范围也是0到1。此时我们便可以通过设置α实现控制正负样本对loss的贡献。

公式:

其中:

分解开就是:

难易样本平衡项

样本属于某个类,且预测结果中该类的概率越大,其越容易分类 ,在二分类问题中,正样本的标签为1,负样本的标签为0,p代表样本为1类的概率。

对于正样本而言,1-p的值越大,样本越难分类。

对于负样本而言,p的值越大,样本越难分类。

Pt的定义如下

所以利用1-Pt就可以计算出每个样本属于容易分类或者难分类。

具体实现方式如下。

两种权重控制方法合并,就得到了Focal Loss

通过如下公式就可以实现控制正负样本的权重和控制容易分类和难分类样本的权重。

分解开就是:

二、Focal Loss代码实现

cpp 复制代码
import torch
import torch.nn as nn
import torch.functional as F

class WeightedFocalLoss(nn.Module):
    "Non weighted version of Focal Loss"    
    def __init__(self, alpha=.25, gamma=2):
            super(WeightedFocalLoss, self).__init__()  
            # --------------#
            #   平衡正负样本系数
            # --------------#      
            self.alpha = torch.tensor([alpha, 1-alpha]).cuda()      
            # --------------#
            #   平衡难易样本系数
            # --------------#   
            self.gamma = gamma
            
    def forward(self, inputs, targets):
            # --------------#
            #   分类交叉熵损失
            # --------------# 
            BCE_loss = F.binary_cross_entropy_with_logits(inputs, targets, reduction='none')   
            # --------------#
            #   标签GT
            # --------------#      
            targets = targets.type(torch.long)     
            # --------------#
            #   计算at
            # --------------#    
            at = self.alpha.gather(0, targets.data.view(-1))   
            # --------------#
            #   计算pt: BEC_loss = -log(pt)  --> pt = torch.exp(-BCE_loss)   
            # --------------#       
            pt = torch.exp(-BCE_loss)   
            # --------------#
            #   计算Focal Loss
            # --------------#       
            F_loss = at*(1-pt)**self.gamma * BCE_loss        
            return F_loss.mean()
相关推荐
Raspberry_Pi_官方账号39 分钟前
观察、理解与响应:Raspberry Pi 5 上的低功耗 CNN、VLM 和 SLM 工作负载
人工智能·神经网络·cnn·树莓派·raspberrypi
AI日报派送佬43 分钟前
2026年10月8日AI行业日报|GPT-6可视化UI全面上线、AI PC硬件革新、智能体安全与商业化提速
人工智能·gpt·openai·谷歌·deepseek·ai日报·智能体技术
MobotStone1 小时前
做了几个 Agent 项目后,我发现:真正拉开 AI 产品经理差距的,不是技术
人工智能·架构
孟健1 小时前
Qwen3.8-27B 本地推理实测:从 14 tok/s 到 159 tok/s 的投机解码调优
人工智能·llm·ai编程
思无邪661 小时前
用 AI 做 JS 逆向:从抓包到复现的完整方法论
开发语言·javascript·人工智能
KeyAction66662 小时前
AI改写战争规则,也在改写商业规则:体系对抗时代已经到来
大数据·人工智能
小蒋观天下2 小时前
专项方案:大场景港口AI安防、多干扰环境下的算法调优与落地实操
人工智能·深度学习·算法·安全·机器学习·计算机视觉·ai大模型
冬奇Lab2 小时前
一天一个开源项目(第231篇):MiniMind —— 花3块钱、2小时,从零训练一个 64M 参数的大语言模型
人工智能·开源·资讯
揽秀亭长2 小时前
视频转脚本有哪些方法?5种方案技术拆解
人工智能·音视频
冬奇Lab2 小时前
LLM 驱动的自动化测试系列(07):移动端自动化(三)——Mobile-Agent-v3 与自研 GUI-Owl 模型路线
android·人工智能·测试