Loss【1】:Focal Loss

系列文章目录


文章目录

  • 系列文章目录
  • 前言
  • 1. 什么是 Focal Loss
  • 2. 逐过程解析 Focal Loss
  • 3. Focal Loss 的 PyTorch 实现
  • 总结


前言

类别不平衡是一个在目标检测领域被广泛讨论的问题,因为目标数量的多少在数据集中能很直观的体现。同时,在分割中这也是一个值得关注的问题,毕竟分割的本质是对像素进行分类。而处理类别不平衡一个非差常用的方法就是通过 Focal Loss 来引导模型更关注困难的类。


1. 什么是 Focal Loss

Focal Loss 是在标准交叉熵损失基础上修改得到的。相比 CrossEntropy Loss 它增加了容易和难分样本的权重,对于难分的样本增加权重,增加 loss 的贡献度;减少易分类样本的权重,使得模型在训练时更专注于难分类的样本。

Focal Loss 从另外的视角来解决样本不平衡问题,那就是根据置信度动态调整 CE Loss,当预测正确的置信度增加时,loss 的权重系数会逐渐衰减至0,这样模型训练的 loss 更关注难例,而大量容易的例子其 loss 贡献很低。

比如假如一张图片上有 10 个正样本,每个正样本的损失值是 3,那么这些正样本的总损失是 10x3=30。而假如该图片上有 10000 个简单易分负样本,尽管每个负样本的损失值很小,假设是 0.1,那么这些简单易分负样本的总损失是 10000x0.1=1000,那么损失值要远远高于正样本的损失值。所以如果在训练的过程中使用全部的正负样本,那么它的训练效果会很差。


2. 逐过程解析 Focal Loss

  1. 公式一览:
    在这里插入图片描述
    • α \alpha α 侧重的是正负样本之间的不平衡,一般设置为 0.25
    • γ \gamma γ 难易样本上的权重调节,一般设置为 2
    • 简单的加权 CE Loss 可能只能实现正负样本之间不平衡的调节,所以对于大多数不平衡任务来说 Focal Loss 应该还是能起到更好的效果
  2. 首先看一下二分类交叉熵损失函数
    在这里插入图片描述
    在这里插入图片描述
  3. 二分类交叉熵损失函数: y y y 是样本的标签值,而 p p p 是模型预测某一个样本为正样本的概率,对于真实标签为正样本的样本,它的概率 p p p 越大说明模型预测的越准确,对于真实标签为负样本的样本,它的概率 p p p 越小说明模型预测的越准确
  4. 如果我们定义 p t p_t pt 为如下的形式
    在这里插入图片描述
  5. 公式 (1) 可以修改为如下形式 (2)
    在这里插入图片描述
  6. 现在我们定义一个参数 α \alpha α 1 − α 1 - \alpha 1α 来平衡正负样本的权重,定义 α t \alpha_t αt 如下,需要注意的是, α \alpha α 是个超参数用来平衡正负样本的权重,并不是实际的正负样本的比例,
    在这里插入图片描述
  7. 公式 (2) 可以修改为如下形式 (3)
    在这里插入图片描述
  8. 又因为样本有难易之分,所以我们必须要能区分出困难样本和简单样本,所以我们设置一个系数 ( 1 − p t ) γ ( 1-p_t )^{\gamma} (1pt)γ
  9. 它可以降低简单样本的损失贡献,而使得训练时更重视一些困难样本,Focal Loss 可以定义为:
    在这里插入图片描述
  10. 看一些权重计算的例子:
    在这里插入图片描述
    • 如果预测正样本概率是 0.95(即对于一个真实标签为正样本的样本,使用模型预测它也是正样本的概率是 0.95),这显然是一个简单的样本
    • 如果预测正样本概率是 0.5 ,这显然是一个稍微困难一定的样本
    • 如果预测负样本的概率为 0.9(即对于一个真实标签为负样本的样本,使用模型预测它是正样本的概率是 0.9),这显然是一个困难的样本,则该样本的难易权重是
    • 如果预测负样本的概率为 0.1(即对于一个真实标签为负样本的样本,使用模型预测它是正样本的概率是 0.1),这显然是一个简单的样本,
  11. 为此,我们得到最终的 Focal Loss
    在这里插入图片描述

3. Focal Loss 的 PyTorch 实现

首先感谢上海 AI Lab 的杰出工作,SAM-Med2D
我这里的实现来自仓库:SAM-Med2D
如果能对大家有帮助,希望后期大家不要忘记引用这个工作:

class FocalLoss(nn.Module):
    def __init__(self, gamma=2.0, alpha=0.25):
        super(FocalLoss, self).__init__()
        self.gamma = gamma
        self.alpha = alpha

    def forward(self, pred, mask):
        """
        pred: [B, 1, H, W]
        mask: [B, 1, H, W]
        """
        assert pred.shape == mask.shape, "pred and mask should have the same shape."
        p = torch.sigmoid(pred)
        num_pos = torch.sum(mask)
        num_neg = mask.numel() - num_pos
        w_pos = (1 - p) ** self.gamma
        w_neg = p ** self.gamma

        loss_pos = -self.alpha * mask * w_pos * torch.log(p + 1e-12)
        loss_neg = -(1 - self.alpha) * (1 - mask) * w_neg * torch.log(1 - p + 1e-12)

        loss = (torch.sum(loss_pos) + torch.sum(loss_neg)) / (num_pos + num_neg + 1e-12)

        return loss


总结

参考链接:
深入剖析Focal loss损失函数

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/517279.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【C++STL详解 —— vector的模拟实现】

CSTL详解 —— vector的模拟实现 vector各函数接口总览vector当中的成员变量介绍默认成员函数**构造函数1:****构造函数2****构造函数3****拷贝构造函数**赋值运算符重载函数 迭代器相关函数begin和end 容量和大小相关函数size和capacityreserveresizeempty 修改容器…

spring boot后端controller中接收表单参数校验

校验分为两部分,一部分是前端的输入时就校验,一部分时后端接收参数时的校验。本文提到的是后端接收参数时的校验。这个后端校验的存在有什么意义呢? 比如我们设置前端在输入参数时限制输入不能为空,应该为3-20位非空字符&#xf…

ENSP华为防火墙WEB登录操作指南

ENSP华为防火墙WEB登录操作指南 华为防火墙登录WEB 1、华为防火墙配置:(需要在互联接口下放通https和ping) int g0/0/0 service-manage https permit service-manage ping permit 2、电脑需要配置虚拟网卡 3、虚拟网卡与云和防火墙配置的IP地…

JDK类加载器剖析

0.前言 我之所以深入研究 Java 类加载器,是为了解决一个奇怪的问题。流行出版物,也就是人们所认为的 Java 世界的灯塔,充斥着关于这个主题的相互矛盾和过时的信息。这种矛盾引发了我的调查 — — 在 Java 类加载器的迷宫中寻求清晰的答案。 …

音视频开发之旅(81)- 图片视频“黑边”检测与去除

目录 1.“黑边“的场景 2. 二值化--单一颜色边缘的图像 3. canny边缘检测霍夫直线变换--处理负责的边缘图像 4. 性能优化 5. 资料 在页面展示中,如果图片/视频有黑边,比较影响体验,我我们今天实现下对图片/视频进行黑边检测。检测到黑边…

校招说明书

3400字的详细说明,介绍了程序员类岗位校招的整体时间节点和招聘流程。还对一些常见的问题进行讨论,例如内推、offer和三方、实习等。 第一章介绍基本的术语,第二章介绍整个校招的重要流程及时间点,然后第三章介绍每次招聘要经过的…

网络:HTTP协议

目录 序列化与反序列化 守护进程 网络计算器的实现 HTTP协议 http的代码演示 HTTPS 初步理解三次握手,四次挥手 ①tcp是面向连接的通信协议,在通信之前,需要进行3次握手,来进行连接的建立(谁connect谁握手) ②当tcp在断开…

《软件方法》剖析“提灯定损”,金将军和南丁格尔

DDD领域驱动设计批评文集 做强化自测题获得“软件方法建模师”称号 《软件方法》各章合集 这几天,江西出了“提灯定损”事件,成为“周公子”、“指鼠为鸭”之后的又一个大IP。 我也蹭一下这个IP,谈一谈软件开发中的业务建模和需求。 图1 “…

git上传到本地仓库

摘要:本地初始化init仓库,进行pull和push;好处是便于利用存储设备进行git备份 git init --bare test.git 随便到一个空的目录下git clone 然后使用git上传 把git仓库删除之后再clone一次验证一下是否上传成功: 如果在ubantu上面没…

实用技巧:如何取消app的截屏禁用

因为我想要在小鹅通App做笔记,但是被小鹅通App禁用截屏了,这真是一个很糟糕的使用体验,虽然可能是为了保护商家权益…… 方法1 可以让商家设置课程可以截屏 方法2 手机root,安装Xposed框架,利用Xposed框架上面的插件我们可以对手机进行高度定制化,而安装Xposed框架的…

Emacs之实现复制当前已打开文件buffer(一百三十五)

简介: CSDN博客专家,专注Android/Linux系统,分享多mic语音方案、音视频、编解码等技术,与大家一起成长! 优质专栏:Audio工程师进阶系列【原创干货持续更新中……】🚀 优质专栏:多媒…

【嵌入式智能产品开发实战】(十六)—— 政安晨:通过ARM-Linux掌握基本技能【Linux shell揭秘】

目录 简述 开始 深入探究Linux内核 1.系统内存管理 2.软件程序管理 3.硬件设备管理 4.文件系统管理 GNU实用工具 1.核心GNU实用工具 2.shell Linux桌面环境 1.X Window软件 2.KDE Plasma桌面 3.GNOME桌面 4.其他桌面 Linux发行版 核心Linux发行版 特定用途的…

卷积篇 | YOLOv8改进之引入全维度动态卷积ODConv | 即插即用

前言:Hello大家好,我是小哥谈。ODConv是一种关注了空域、输入通道、输出通道等维度上的动态性的卷积方法,一定程度上讲,ODConv可以视作CondConv的延续,将CondConv中一个维度上的动态特性进行了扩展,同时了考虑了空域、输入通道、输出通道等维度上的动态性,故称之为全维度…

在一套Dockerfile中完成编译和运行环境部署

大纲 解释型语言编译环境解释环境编译型语言编译环境运行环境 方法编译环境安装系统安装编译依赖下载代码特殊处理(可以忽略)编译准备(可以忽略)编译打包依赖(编译结果) 运行环境安装操作系统安装运行时依赖…

RabbitMQ高级-应用问题、集群搭建

1.消息补偿 消息可靠性保障:——消息补偿机制 需求:100%确保消息发送成功 2.幂等性保障 幂等性指一次和多次请求某一资源,对于资源本身应该具有同样的结果。也就是说,其任意多次执行对资源本身所产生的影响均与第一次执行的影响…

AI编程005/ 逆向生成mysql的建表语句

1/ 通过insert into 语句生成建表语句 有些时候我们能获取到表的insert语句,但是没有表结构。我们可以借助AI工具,让其逆向生成mysql的建表语句。 提示词如下: 根据下面的SQL语句,逆向生存mysql的建表语句,每个字段…

Redis配置与优化

目录 引言 一、关系型数据库与非关系型数据库 1、关系型数据库 2、非关系型数据库 3、关系型数据库和非关系型数据库的区别 1.数据存储方式不同 2.扩展方式不同 3.对事物性的支持不同 4、非关系型数据库产生背景 二、Redis简介 1、Redis优点 2、Redis为什么这麽快&…

企业员工岗前培训管理系统的设计与实现(论文+源码)_kaic

摘 要 有效的处理想要的相关信息和如何传播有效的信息,一直是人类不断探索的动力。人类文明火种的传承都是通过了多种媒介作为载体,也是随着社会生产力的发展不断的更新。随着互联网的到来,信息传播与管理都上升了一个新的台阶,并…

基于单片机的全自动洗衣机系统仿真设计

**单片机设计介绍,基于单片机的全自动洗衣机系统仿真设计 文章目录 一 概要二、功能设计设计思路 三、 软件设计原理图 五、 程序六、 文章目录 一 概要 基于单片机的全自动洗衣机系统仿真设计概要是关于利用单片机技术实现全自动洗衣机控制功能的系统设计概述。以…

【5】JavaScript - 控制语句 循环[ for/while ]

控制语句 while/do...while 语句while 语句:do...while 语句:两者的区别无限循环 for 语句普通的 for 循环for...in 循环for...of 循环 循环过程:跳出/跳过跳出跳过 循环嵌套扩展延申:做一次杠精 当前 控制语句 章节主要介绍 循环…