样本不平衡 pytorch_CVPR2019 | 面对高度不均衡数据如何提高精度?这篇文章有妙招...
作者 | Skura编辑 | Camel
本文是对 CVPR 2019 论文「Class-Balanced Loss Based on Effective Number of Samples」的一篇点评。
这篇论文针对最常用的损耗(softmax 交叉熵、focal loss 等)提出了一种按类重新加权的方案,以快速提高精度,特别是在处理类高度不平衡的数据时尤其有用。
本文的实现方法(PyTorch)的 github 地址为:
https://github.com/vandit15/Class-balanced-loss-pytorch
有效样本数
在处理长尾数据集(一个数据集的大多数样本属于少数类,而其它许多类的数据很少)时,决定如何权衡不同类的损失是很棘手的。通常,权重设置为类支持的逆或类支持的平方根的逆。
传统重加权与这里提到的重加权
然而,如上图所示,这种现象是因为随着样本数的增加,新数据点带来的额外好处减少了。在训练神经网络时使用重数据增强(如重缩放、随机裁剪、翻转等)时,新添加的样本很可能是现有样本的近似副本。用有效样本数重新加权得到了较好的结果。
有效样本数可以想象为 n 个样本覆盖的实际体积,其中总体积 N 由总样本数表示。
有效样本数
我们写出其公式:
有效样本数
这里,我们假设一个新的样本将只以两种方式与先前采样的数据交互:完全覆盖或完全没有交集(如上图所示)。在这种假设下,用归纳法可以很容易地证明上述表达式(请参阅本文的证明)。
我们也可以像下面这样写:
每个样本的贡献
这意味着第 j 个样本对有效样本数贡献为 β^(j-1)。
上述方程的另一个含义是,如果 β=0,则 En=1。同时,En=n 则 β=1。后者可以很容易地用 L'Hopital's 法则证明。这意味着当 N 很大时,有效样本数与样本数相同。在这种情况下,唯一原型数 N 很大,每个样本都是唯一的。然而,如果 N=1,这意味着所有数据都可以用一个原型表示。
类平衡损失
如果没有额外的信息,我们不能为每个类设置单独的 β 值,因此,使用整个数据,我们会将其设置为特定值(通常设置为0.9、0.99、0.999、0.9999 之一的数值)。
因此,类平衡损失可以写成:
CB 损失
这里,L(p,y) 可以是任何损失函数。
类平衡 focal loss
类平衡 focal loss
原始版本的 focal loss 有一个 alpha 平衡变量。相反,我们将使用每个类的有效样本数对其重新加权。
类似地,这种重新加权项也可以应用于其他著名的损失(sigmoid 交叉熵、softmax 交叉熵等)。
应用
在开始应用之前,在使用基于 sigmoid 的损耗进行训练时要注意一点:用 b=-log(c-1)初始化最后一层的偏差,其中类的数量是 c,而不是 0。这是因为设置 b=0 在训练开始时会导致巨大的损失——每个类的输出概率接近 0.5。因此,我们可以假设类 prior 是 1/c,并相应地设置值 b。
类的权重计算
计算标准化权重
上面的代码行是一个简单的实现,获取权重并将其标准化。
获取 one-hot 标签的 PyTorch 张量
在这里,我们得到权重的 one hot 值,这样它们就可以分别与每个类的损失值相乘。
实验
类平衡提供了显著的优势,特别是当数据集高度不平衡时(不平衡=200100)。
结论
利用有效样本数的概念,可以解决数据重合的问题。由于我们没有对数据集本身做任何假设,因此重新加权项通常适用于多个数据集和多个损失函数。因此,类不平衡的问题可以用一个更合适的结构来解决,这一点很重要,因为现实世界中的大多数数据集都存在大量的数据不平衡。
参考
[1] Class-Balanced Loss Based on Effective Number of Samples: https://arxiv.org/abs/1901.05555
via:https://towardsdatascience.com/handling-class-imbalanced-data-using-a-loss-specifically-made-for-it-6e58fd65ffab
样本不平衡 pytorch_CVPR2019 | 面对高度不均衡数据如何提高精度?这篇文章有妙招...相关推荐
- 新思路!商汤开源利用无标注数据大幅提高精度的人脸识别算法
出处"来自微信公众号:我爱计算机视觉" 新思路!商汤开源利用无标注数据大幅提高精度的人脸识别算法 这篇论文解决的问题与现实中的人脸识别应用场景密切相关,其假设已经有了少量已经标注的 ...
- 2021年最值得期待的数据智能赛事之一,有何解题妙招?
在 GIS(Geographic Information System)领域,由国际计算机学会 ACM 空间信息专业委员会主办的 ACM SIGSPATIAL,被认为是 GIS 科学与计算机科学结合最 ...
- 天下数据教你提升网站访问速度的妙招
许多用户在建站初期出于对成本的考虑,都会选择国外虚拟主机来搭建网站,但是,一旦网页内容增多,访问量变大就会出现网站打开速度缓慢的问题.如果是搭建独立服务器.购买独立带宽带宽.CDN这类硬指标我们没有经 ...
- 大数据技术之Canal入门篇
大数据技术之Canal入门篇 文章目录 大数据技术之Canal入门篇 写在前面 第 1 章 Canal 入门 1.1 什么是 Canal 1.2 MySQL 的Binlog 1.2.1 什么是 Bin ...
- 基于R的Bilibili视频数据建模及分析——预处理篇
基于R的Bilibili视频数据建模及分析--预处理篇 文章目录 基于R的Bilibili视频数据建模及分析--预处理篇 0.写在前面 1.项目介绍 1.1 项目背景 1.2 数据来源 1.3 数据集 ...
- Pytorch CIFAR10图像分类 数据加载与可视化篇
Pytorch CIFAR10图像分类 数据加载与可视化篇 文章目录 Pytorch CIFAR10图像分类 数据加载与可视化篇 1.数据读取 2. 查看数据(格式,大小,形状) 3. 查看图片 np ...
- 样本不平衡不均衡数据处理
20220302 对连续性的不平衡也可以参照分类型数据的不平衡处理方法?划分为多个集合求平均值? 20220125 # 数据划分negtive_rows = negtive_data.shape[0] ...
- 8大策略让你对抗机器学习数据集里的不均衡数据
本文转自:http://www.36dsj.com/archives/35137 http://blog.csdn.net/heyongluoyao8/article/details/49408131 ...
- 堪比Focal Loss!解决目标检测中样本不平衡的无采样方法
训练目标检测模型的一个难点是样本不均衡,特别是正负样本比例严重失衡.目前解决这类问题主要是两种方案(见综述Imbalance Problems in Object Detection: A Revie ...
- 【机器学习】机器学习中样本不平衡,怎么办?
在银行要判断一个"新客户是否会违约",通常不违约的人VS违约的人会是99:1的比例,真正违约的人 其实是非常少的.这种分类状况下,即便模型什么也不做,全把所有人都当成不会违约的人, ...
最新文章
- git 修改仓库的描述_git简介、基本命令和仓库操作
- PostgreSQL在何处处理 sql查询之十二
- daterangepicker 日期范围插件自定义 可选 年份
- php 判断3个数谁最小,Python编程学习之如何判断3个数的大小
- ubuntu中make头文件找不到_和平精英:游戏中找不到人怎么办?这些技巧帮你练出“火眼金睛”...
- 大数据(big data)_如何使用Big Query&Data Studio处理和可视化Google Cloud上的财务数据...
- 加入初创企业需要想清楚的几个问题
- oracle的等保,3.Oracle 检查(部分)
- 星际通讯+基于区块链的价值共享互联网即时通讯应用平台
- 牛客网--华为机试在线训练10:字符个数统计
- cudnn 7.5 linux x64,Ubuntu 18.04 N卡驱动安装+CUDA10.0+cuDNN7.5+Anaconda+Tensorflow-GPU
- Unicode 字符编码
- 工业数据采集网关的特点及应用场景
- 面试官问我:什么是消息队列?什么场景需要他?用了会出现什么问题?
- STM32普通IO模拟SPI和W25Q32通信调试
- html,css,js,简单的网页留言板
- Luogu P3387 【模板】缩点
- fragment重叠问题
- c语言累乘法,C语言基本算法
- 2021年度隐私计算十大人物评选出炉
热门文章
- 【图像处理】基于matlab颜色恒常性算法水下图像处理【含Matlab源码 474期】
- 【缺陷识别】基于matlab GUI SVM金属表面缺陷分类与测量【含Matlab源码 682期】
- 【图像分割】基于matlab粒子群优化T熵图像分割【含Matlab源码 286期】
- 【数字信号】基于matlab GUI数字电子琴【含Matlab源码 273期】
- c语言中逻辑运算符中感叹号,某棋牌 -官网
- redis 验证订单_php+redis消息队列实现抢购功能
- Linux的dev目录被删除,详解Linux系统下的/dev目录
- 例3.6 二叉搜索树 - 九度教程第36题(二叉排序树)
- access insert语句怎么写_ySQL中特别实用的几种SQL语句送给大家
- c++ map 修改value_深度解密Go语言之map