Focal Loss损失函数

news2024/11/26 13:46:58

目录

前言

交叉熵损失函数

平衡交叉熵

Focal Loss

代码实现


前言

Focal loss是一个常用的解决类别不平衡问题的损失函数,由何恺明提出的(论文名称:Focal Loss for Dense Object Detection),用于图像领域解决one-stage目标检测中正负样本极不平衡和难分类样本学习问题。本文从交叉熵损失函数出发,分析样本不平衡问题,将focal loss与交叉熵损失函数对比,给出focal loss有效性的解释。

交叉熵损失函数

分类通常用到交叉熵,而且Focal Loss 也是基于交叉熵进行改进的,先介绍一下交叉熵的原理,会更易于理解Focal Loss。

二分类交叉熵损失函数,公式定义如下:

 现定义如下的p_{t}

 得到变形后的损失函数如下:

平衡交叉熵

由于存在正负样本极不平衡的问题,直接使用交叉熵损失函数,得到的效果不好。于是,首先平衡交叉熵。

一般为了解决类别不平衡的问题,会在损失函数中每个类别前增加一个权重因子\alpha _{i} ∈ [0, 1]来协调类别不平衡。使用p_{t}类似的方式定义\alpha _{t},得到二分类平衡交叉熵损失函数:

平衡交叉熵采用\alpha平衡正负样本的重要性,但是没有区分难易样本。然后,类间不均衡较大会导致,交叉熵损失在训练的时候受到影响。易分类的样本的分类错误的损失占了整体损失的绝大部分,并主导梯度,会压垮交叉熵损失函数。

Focal Loss

Focal Loss在平衡交叉熵损失函数的基础上,增加一个调节因子降低易分类样本权重,聚焦于困难样本的训练,其定义如下:

 \alpha权重帮助处理了类别的不均衡。

 其中,(1-p_{t})^{\gamma }是调节因子,\gamma≥ 0是可调节的聚焦参数,下图展示了\gamma ∈ [0, 5]不同值时focal loss曲线。

γ 控制曲线的形状. γ的值越大, 好分类样本的loss就越小, 我们就可以把模型的注意力投向那些难分类的样本. 一个大的 γ 让获得小loss的样本范围扩大了。同时,当γ=0时,这个表达式就退化成了Cross Entropy Loss (交叉熵损失函数)。

在上图中,“蓝”线代表交叉熵损失。X轴即“预测为真实标签的概率”(为简单起见,将其称为pt)。Y轴是给定pt后Focal loss和CE的loss的值。

从图像中可以看出,当模型预测为真实标签的概率为0.6左右时,交叉熵损失仍在0.5左右。因此,为了在训练过程中减少损失,我们的模型将必须以更高的概率来预测到真实标签。换句话说,交叉熵损失要求模型对自己的预测非常有信心。但这也同样会给模型表现带来负面影响。

深度学习模型会变得过度自信, 因此模型的泛化能力会下降。

当使用γ> 1的Focal Loss可以减少“分类得好的样本”或者说“模型预测正确概率大”的样本的训练损失,而对于“难以分类的示例”,比如预测概率小于0.5的,则不会减小太多损失。

Focal Loss特点:

  • p_{t}很小时(样本难分,不管分的是否正确),调节因子趋近1,损失函数中样本的权重不受影响;当p_{t}很大时(样本易分,不管分的是否正确),调节因子趋近0,损失函数中样本的权重下降很多
  • 聚焦参数\gamma可以调节易分类样本权重的降低程度,\gamma越大权重降低程度越大

通过分析Focal Loss函数的特点可知,该损失函数降低了易分类样本的权重,聚焦在难分类样本上。

代码实现

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')        
            targets = targets.type(torch.long)        
            at = self.alpha.gather(0, targets.data.view(-1))        
            pt = torch.exp(-BCE_loss)        
            F_loss = at*(1-pt)**self.gamma * BCE_loss        
            return F_loss.mean()

主要参考了这篇文章:Focal Loss损失函数详解

这篇:focal loss 通俗讲解 

提出它的论文解读:Focal loss论文详解

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

学习系统编程No.29【线程执行过程之页表详解】

引言: 北京时间:2023/7/3/14:09,刚睡醒,放假在家起床时间确实不怎么好调整,根本固定不了一点,当然通俗点说也就是根本起不来,哈哈哈,已经很少见到那种7点起来码字的情形了&#xff…

NanopcT4 系统 人脸检测实验 超详细教程 代码及操作步骤

文章目录 1.NanopcT4 系统烧写详细操作步骤2.vim 使用与 gcc 使用3.makefile 使用4.GPIO 引脚查看与连接5.使用vim 编写 LED 灯闪烁c 语言程序test1.c6.使用vim 编写 LED 灯闪烁shell 脚本程序test2.sh7.在ARM 上实现人脸检测 1.NanopcT4 系统烧写详细操作步骤 1)准备一张 8G …

口语理解任务源码详解系列(二)利用seq2seq-attention模型实现

利用seq2seq-attention模型实现 写在前面 在前文介绍了项目的数据集构建:传送门 本文利用seq2seq-attention实现:实现细节请参考论文:《Attention-Based Recurrent Neural Network Models for Joint Intent Detection and Slot Filling》 1.意…

喜羊羊贴吧顶帖软件实战教学

喜羊羊贴吧顶帖软件实战教学#贴吧顶帖#贴吧推广 大家好,欢迎来到百收网SEO这期视频,给大家更新一下百度贴最新的一个顶帖视频教程。首先我们今天用的顶帖软件是我们的喜羊羊173 的一个版本,软件的话在我们的群文件去下载,就是我们…

如何查看货物的物流状态

想不想有一个一键批量查询快递号的软件?今天,小编向您介绍一款软件:“固乔快递查询助手”,该软件是固乔工作室正式推出的专业快递和物流单号出货信息批量查询软件。这款软件功能实用,操作简单,页面简单&…

使用 Jackson 库对日期时间的动态序列化反序列化操作

0.背景 因某项目中的数据报表功能在创建年报 和月报时需要生成不同的日期格式,但数据结构未变,为避免类的冗余定义,故使用如下方式来动态设置日期格式,在不同报表是使用不同格式的时间格式来保存数据。 1.代码介绍 PS:此介绍有Cha…

深度学习技巧应用23-利用latex对深度学习各种网络模型的图像进行绘制

大家好,我是微学AI,今天给大家介绍一下深度学习技巧应用23-利用latex对深度学习各种网络模型的图像进行绘制,大家知道那些好看的模型结构图是怎么画的吗?今天就给大家手把手的利用latex绘画出深度学习模型图出来,我将利用latex画出AlexNet,LeNet,VGG16,U-Net高清的网络模型…

微服务一 实用篇 - 5.1 ElasticSearch安装

《微服务一 实用篇 - 5.1 ElasticSearch安装》 提示: 本材料只做个人学习参考,不作为系统的学习流程,请注意识别!!! 《微服务一 实用篇 - 5.1 ElasticSearch安装》 《微服务一 实用篇 - 5.1 ElasticSearch安装》1.部署单点es1.1.创建网络1.2.加载镜像1.3.运行 2.部署kibana2.1…

达芬奇快编键盘使用指南——个人白皮书分享

文章目录 序言常见问题(陆续更新)1.没有指示灯,不知道怎么开机 功能分区和翻译查询A快编工具(Smart Insrt)B修剪工具(Trim In)C多功能按键(Esc)D多机位区(Cam…

新加坡访问学者签证申请的三个注意事项

新加坡是一个独特而美丽的国家,吸引了许多学者和研究人员前来访问和交流。如果您计划前往新加坡进行学术交流,下面是知识人网小编整理的关于新加坡访问学者签证申请的三个注意事项,希望对您有所帮助。 1. 签证申请和文件准备: 在…

Scala入门到放弃—01—概述

文章目录 概述什么是是Scala?为什么要使用Scala? 配置环境安装测试附 基本语法定义变量基本数据类型lazy在Scala中的应用 概述 什么是是Scala? https://www.scala-lang.org/ Scala combines object-oriented and functional programming in one conci…

ELK实验部署过程

ELK集群部署环境准备 配置ELK日志分析系统 192.168.1.51 elk-node1 es、logstash、kibana 192.168.1.52 elk-node2 es、logstash 192.168.1.53 apache logstash (我这里是把虚拟机的配置全部都改为2核3G的) 2台linux 第1台:elk-nod…

大数据开发工程师前景如何?

大数据需求越来越多,只有技术在手不愁找不到工作。 大数据工程师的技术要求如下: 1、掌握至少一种数据库开发技术:Oracle、Teradata、DB2、Mysql等,灵活运用SQL实现海量数据ETL加工处理; 2、熟悉Linux系统常规shell…

软件工程——第8章维护知识点整理

本专栏是博主个人笔记,主要目的是利用碎片化的时间来记忆软工知识点,特此声明! 文章目录 1.维护阶段的基本任务是? 2.大型软件的维护成本大概是开发成本的几倍? 3.什么是软件维护? 4.软件维护分为哪几类…

python代码练习:猜成语游戏

python代码练习:猜成语游戏 题目结果展示源代码 题目 成语填填乐,随机输出一条包含一个空格的成语,填写答案并判断是否正确,正确加2分,输出“正确,你真棒”,错误减2分,输出“错了”…

git tag详解

文章目录 前言1. Git tag的基本概念和用法1.1. 什么是 Git tag?1.2. Git 标签有什么作用? 2. 创建 Git tag2.1. 创建轻量级tag2.2. 创建带有注释的tag2.3. 编辑已有的tag 3. 列出和检出 Git tag3.1. 列出所有tag3.3. 列出匹配的tag3.4. 检出tag 4. 将 Gi…

可视化 | Flask+Mysql+PyEcharts 电影Top250数据分析系统

文章目录 🏳️‍🌈 1. 数据库数据表1. 电影信息数据表2. 用户数据表 🏳️‍🌈 2. 各子界面1. 登陆界面2. 注册界面3. 电影信息概要界面4. 搜索界面5. 各年份上映电影数量6. 电影榜单TOP107. 评价人数TOP208. 地区电影TOP109. 电影…

uniapp 微信小程序导航功能(单个地址)

获取终点的坐标&#xff0c;根据终点的坐标&#xff0c;终点名称&#xff0c;终点详细地址&#xff0c;调起地图导航到第三方APP 1、针对单个地址导航 <template><view click"toGetLocation"></view><view click"toNavigation">&…

利用Docker实现容器互连

实验要求 掌握利用Docker实现跨主机容器互连的方法。 实验准备 要求实验主机能够连接外网&#xff0c;已经正确安装Docker&#xff0c;并关闭防火墙和selinux&#xff0c;各主机配置信息如表所示 表 主机配置信息表 主机名 IP地址/子网掩码 容器名 容器IP地址 node1 你…

选对方法,K8s 多集群管理没那么难

作者&#xff1a;庄宇 Kubernetes 作为一项核心技术已成为现代应用程序架构的基础&#xff0c;将 Kubernetes 作为容器编排系统已发展为越来越多企业的必然选择。 随着对云计算接受程度不断提高&#xff0c;以及企业规模和业务持续发展的共同驱动下&#xff0c;越来越多的企业…