【DL】FocalLoss的PyTorch实现

Focal Loss 原理详解及 PyTorch 代码实现 Focal Loss 是为解决类别不平衡问题设计的损失函数,通过引入 gamma 参数降低易分类样本的权重,使用 alpha 参数调节正负样本比例。在目标检测等类别不平衡场景中表现优异。"""应用 Focal Loss 通过 gamma 和 alpha 参数改进 BCEWithLogitsLoss 以处理类别不平衡"""self.loss_fcn = loss_fcn # 必须使用 nn.BCEWithLogitsLoss()self.gamma = gamma # 调节难易样本权重的指数参数。 阅读详情

【DL】FocalLoss的PyTorch实现

此篇不介绍FocalLoss的原理,仅展示PyTorch实现FocalLoss的两种方式。个人认为相关原理已在文章《FocalLoss原理通俗解释及其二分类和多分类场景下的原理与实现》中讲得很清晰,故此篇不再介绍。

方式一

同时计算一个batch中所有样本关于FocalLoss的损失值(来自文章《FocalLoss原理通俗解释及其二分类和多分类场景下的原理与实现》,个人补充了一些注释):

import torch
from torch import nn
import random
class FocalLoss(nn.Module):
    """
    参考 https://github.com/lonePatient/TorchBlocks
    """

    def __init__(self, gamma=2.0, alpha=1, epsilon=1.e-9, device=None):
        super(FocalLoss, self).__init__()
        self.gamma = gamma
        if isinstance(alpha, list):
            self.alpha = torch.Tensor(alpha, device=device)
        else:
            self.alpha = alpha
        self.epsilon = epsilon
    
    '''
    batch中所有样本一起计算loss
    '''
    def forward(self, input, target):
        """
        Args:
            input: model's output, shape of [batch_size, num_cls]
            target: ground truth labels, shape of [batch_size]
        Returns:
            shape of [batch_size]
        """
        num_labels = input.size(-1) # 类别数量
        idx = target.view(-1, 1).long() # 行向量target变成列向量idx
        one_hot_key = torch.zeros(idx.size(0), num_labels, dtype=torch.float32, device=idx.device)
        one_hot_key = one_hot_key.scatter_(1, idx, 1) # one_hot_key矩阵中的每一行对应相应样本的标签one_hot向量,利用scatter_方法将样本的标签类别标记为1,其余位置为0
        one_hot_key[:, 0] = 0  # ignore 0 index. 此行需要视具体情况决定是否保留,如果标签中存在类别0(而不是直接从类别1开始),此行应当注释、不使用
        logits = torch.softmax(input, dim=-1)
        loss = -self.alpha * one_hot_key * torch.pow((1 - logits), self.gamma) * (logits + self.epsilon).log() # 计算FocalLoss
        loss = loss.sum(1)
        return loss.mean()

# 固定随机数种子,方便复现
def setup_seed(seed):
     torch.manual_seed(seed)
     torch.cuda.manual_seed_all(seed)
     np.random.seed(seed)
     random.seed(seed)
     torch.backends.cudnn.deterministic = True

if __name__ == '__main__':
    loss = FocalLoss(alpha=[0.1, 0.2, 0.3, 0.15, 0.25])
    # 设置随机数种子
    setup_seed(20) 
    input = torch.randn(3, 5, requires_grad=True) # torch.Size([3, 5]) [sample_num, class_num]
    target = torch.empty(3, dtype=torch.long).random_(5) # torch.Size([3]) [sample_num]
    output = loss(input, target)
    # print(output)
    output.backward()

方式二

一个batch中逐个样本计算关于FocalLoss的损失值,将它们求平均,返回一个batch内所有样本的FocalLoss的平均值:

import torch
from torch import nn
import random
class FocalLoss(nn.Module):
    """
    参考 https://github.com/lonePatient/TorchBlocks
    """

    def __init__(self, gamma=2.0, alpha=1, epsilon=1.e-9, device=None):
        super(FocalLoss, self).__init__()
        self.gamma = gamma
        if isinstance(alpha, list):
            self.alpha = torch.Tensor(alpha, device=device)
        else:
            self.alpha = alpha
        self.epsilon = epsilon
	
    '''
    逐个样本计算loss
    '''    
	def forward(self, input, target):
        """
        Args:
            input: model's output, shape of [batch_size, num_cls]
            target: ground truth labels, shape of [batch_size]
        Returns:
            shape of [batch_size]
        """
        num_labels = input.size(-1) # 类别数量
        loss = []
        for i, sample in enumerate(input):
            one_hot_key = torch.zeros(1, num_labels, dtype=torch.float32, device=input.device)
            one_hot_key.scatter_(1, target[i].view(1, -1), 1)

            logits = torch.softmax(sample, dim=-1)
            loss_this_sample = - self.alpha * one_hot_key * torch.pow((1 - logits), self.gamma) * (logits + self.epsilon).log()
            loss_this_sample = loss_this_sample.sum(1)
            if i == 0:
                loss = loss_this_sample
            else:
                loss = torch.cat((loss, loss_this_sample))

        return loss.mean()

# 固定随机数种子,方便复现
def setup_seed(seed):
     torch.manual_seed(seed)
     torch.cuda.manual_seed_all(seed)
     np.random.seed(seed)
     random.seed(seed)
     torch.backends.cudnn.deterministic = True

if __name__ == '__main__':
    loss = FocalLoss(alpha=[0.1, 0.2, 0.3, 0.15, 0.25])
    # 设置随机数种子
    setup_seed(20) 
    input = torch.randn(3, 5, requires_grad=True) # torch.Size([3, 5]) [sample_num, class_num]
    target = torch.empty(3, dtype=torch.long).random_(5) # torch.Size([3]) [sample_num]
    output = loss(input, target)
    # print(output)
    output.backward()
pytorch基础使用—自定义损失函数 损失函数的定义,二值交叉熵损失,Focal Loss损失 阅读详情

相关推荐

使用PyTorch实现自定义损失函数以FocalLoss为例的详细教程

在深度学习模型训练中,损失函数的选择对模型性能有着至关重要的影响。标准的交叉熵损失函数在类别平衡的数据集上表现良好,但在处理类别极度不平衡的数据时,模型可能会被多数类主导,导致对少数类的分类性能不佳。Focal Loss正是为了解决类别不平衡问题而设计的,它通过调整难易样本的权重,让模型更加关注难以分类的样本。通过本文的介绍,我们了解了Focal Loss的原理及其在PyTorch中的实现方法。自定义损失函数是深度学习研究中的重要技能,掌握了这一技能后,研究人员可以根据具体任务需求设计更加合适的优化目标。

ll577644332的博客 456

Focal loss的Pytorch实现

1.Focal Loss介绍 Focal loss是在CrossEntropy基础上进行改进的,主要解决了训练中正负样本重要性不均衡的问题。首次提出是在论文 《Focal Loss for Dense Object Detection》中,作者Kaiming He的出发点是想解决样本的类别不均衡导致的one-stage和two-stage的表现差异问题。 2.损失函数公式 ...

qq_29056645的博客 8353

极智项目 | 实战pytorch arcface人脸识别

大家好,我是极智视界,本文介绍 实战pytorch arcface人脸识别,并提供完整项目源码。

极智视界 2607

讲解Focal Loss 的Pytorch

在处理类别不平衡问题时,常规的交叉熵损失函数对于大量的易分类样本会产生较大的损失,从而使模型主要关注于难分类的样本。Focal Loss通过引入一个可调控的参数和一个缩放因子,降低易分类样本的权重,从而更加关注于难分类样本,提升整体模型性能。Focal Loss的数学表达式如下: 其中,表示模型的预测概率,是一个常数,用于调整易分类样本的权重。

牛肉胡辣汤 1631

VisionMaster Qt二次开发:图像获取、COM组件渲染与本地化存储实战

本文详细介绍了基于VisionMaster进行Qt二次开发的核心实战流程,涵盖环境搭建、方案加载、图像数据获取、COM组件渲染与本地化存储。重点解析了如何通过COM组件在Qt界面中实时显示图像,以及将VM图像数据转换为QImage并保存为本地文件的关键步骤与常见问题,为工业视觉项目开发提供稳定高效的解决方案。

weixin_29229261的博客 205

基于近场动力学的二维疲劳裂纹扩展模型_近场动力学数值模拟的程序实现(1)——引言...

参考书目W. H. Gerstle. 2015. Introduction to Practical Peridynamic: Computational Solid Mechanics Without Stress and Strain.E.Madenci, A.Barut, M.Dorduncu. Peridynamic Differential Operator for Numerical ...

weixin_39764603的博客 1202

pytorch如何使用Focal Loss

Focal loss是 文章中提出对简单样本的进行decay的一种损失函数。是对标准的的一种改进。F L对于简单样本(p比较大)回应较小的loss。如论文中的图1, 在p=0.6时, 标准的CE然后又较大的loss, 但是对于FL就有相对较小的loss回应。这样就是对简单样本的一种decay。其中alpha 是对每个类别在训练数据中的频率有关, 但是下面的实现我们是基于alpha=1进行实验的。在PyTorch中使用Focal Loss,你可以按照以下步骤进行操作。

githubcurry,985cs博士在读 1万+

【rt-thread实战解析】从零到一:基于STM32与LAN8720A的以太网驱动配置全流程

本文详细解析了在RT-Thread操作系统上为STM32F407配置LAN8720A以太网驱动的全流程。从硬件连接自查、CubeMX工程创建、PHY复位函数编写,到RT-Thread工程配置、LwIP协议栈集成,最后进行实际上电测试与网络调试,手把手指导开发者避开常见陷阱,实现稳定的以太网连接。

m2n3b4v5c6的博客 525

一文读懂Focal Loss及Pytorch代码(详细注释)

文章目录前言Focal Loss详解Pytorch实现总结 前言 Focal Loss及RetinaNet原理见另一篇文章:【论文精读】Focal Loss for Dense Object Detection(RetinaNet)全文翻译及重点总结 本文介绍Focal Loss以及其Pytorch实现。 Focal Loss详解 直接上公式: FL(pt)=−αt(1−pt)γlog(pt)FL(p_t)=-\alpha_t(1-p_t)^\gamma log(p_t)FL(pt​)=−αt​(1−pt

主要更新底层视觉(去噪、超分等)相关的科研内容,形式为【论文精读】+【论文复现】 20万+

DeepSeek赋能CAD:从API调用到智能设计工作流的实战指南

本文详细介绍了如何利用DeepSeek AI技术赋能CAD设计工作流,从API调用到智能设计优化的实战指南。通过Python环境配置、API接入详解以及四大智能设计场景的实战案例,帮助CAD设计师实现参数化设计优化、自动规范检查等高效工作方式,大幅提升设计效率和质量。

weixin_29092579的博客 623

Datalog语言详解

Datalog是一种声明式逻辑编程语言,起源于数据库理论和逻辑编程领域。作为Prolog的子集,它专注于递归查询和推理,通过定义事实和规则来描述数据关系而非计算步骤。Datalog的关键特性包括规则安全、递归、分层否定和扩展聚合功能,保证了程序的终止性和高效性。相较于SQL,Datalog更擅长处理递归查询;相比Prolog,它更注重数据库友好性。Datalog在程序分析、知识图谱、网络安全等领域有广泛应用,其声明式特性使代码简洁易维护,但同时也面临生态系统小、性能调试难等挑战。现代工具如Soufflé、D

bulita great world 1843

深度学习:Pytorch常见损失函数Loss简介

深度学习:Pytorch常见损失函数Loss简介

博学而笃志,切问而近思。 1202

【RBF预测】基于粒子群算法优化RBF神经网络实现数据回归预测含Matlab源码

1 简介 原油含水率预测对于确定油井水,油层位以及估计原油产量有着非常重要意义.BP神经网络是最近常用的原油含水率预测方法,然而,由于BP神经网络存在容易陷入局部极小值,收敛速度慢等问题,影响了其预测的实用性和准确性,对此,提出基于粒子群优化RBF神经网络(PSO-RBFNN)的原油含水率预测方法,粒子群优化算法用于RBF神经网络参数优化.在分析原油含水率预测的影响因素基础上,建立粒子群优化RBF神经网络的原油含水率预测模型.实验结果表明,在原油含水率预测中,基于粒子群优化RBF神经网络比BP神经网络有着

qq_59747472的博客 1232

Pytorch 常见损失函数实现

Pytorch 常见损失函数实现1.CrossEntropyLoss()函数1.1.基本计算公式1.2.Pytorch自带计算2.Focal Loss2.1.基本计算公式基本计算表达式:2.2.Pytorch实现3.二分类Dice Loss3.1.基本计算公式3.2.Pytorch实现4.多分类Dice Loss损失函数4.1.基本计算思路4.2.Pytorch实现 1.CrossEntropyLoss()函数 1.1.基本计算公式 1.2.Pytorch自带计算 Pytorch中计算的交叉熵: 其中自带

ssshyeong的博客 1880

从4A架构的角度出来 帮我分析一下:数字化转型深水区:企业架构如何成为价值重构的核心引擎?

4A 架构的本质是构建企业的数字神经系统,通过业务感知、数据传输、决策执行、技术支撑的闭环,实现从效率提升到生态重构的质变。正如华为通过该架构实现全球研发资源统一调度,某零售集团借此打造线上线下融合的新零售体系,当业务、数据、应用、技术四个维度形成共振时,企业将获得持续进化的数字免疫力,在不确定的市场环境中保持韧性生长。这一过程不仅需要技术工具的升级,更依赖组织文化的变革 —— 从 “部门墙” 到 “能力网” 的转型,才是数字化转型深水区的终极挑战。

金牌架构师 1044

【AI Agent教程】各种Agent开发框架都是如何实现ReAct思想的?深入源码学习一下

驱动大模型有很多种方式,例如纯Prompt方式、思维链方式、ReAct方式等。ReAct 方式是 AI Agent 最常用的实现思路之一,它强调在执行任务时结合推理(Reasoning)和行动(Acting)两个方面,使得Agent能够在复杂和动态的环境中更有效地工作。

同学小张的博客 6396

常用Loss总结

1. BCELoss 用于二分类任务,二值交叉熵(Binary Cross Entropy)。 公式如下,其中y是真实值,是预测值: 使用方式如下: class torch.nn.BCELoss Examples:: >>> m = nn.Sigmoid() >>> loss = nn.BCELoss() ...

一千零一夜的博客 1万+

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

深度学习之损失(Loss)函数的介绍【详解】

深度学习之损失函数的介绍

qq_23022733的博客 6606

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

【深度学习】动态交叉熵损失函数Focal Loss

FocalLoss,由何恺明等人在2017年的论文《》中提出。它是一种专门为解决,目标检测中类别不平衡和难易样本不平衡问题而设计的损失函数。当然,也是可以适用于图像分割。本文将详细介绍FocalLoss的基本概念、思想原理,以及如何设置 FocalLoss中的关键参数,并提供PyTorch的实现代码。

Yngz_Miao的博客 2422

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

pytorch使用FocalLoss损失函数用于分类问题

参考:https://zhuanlan.zhihu.com/p/28527749 https://www.jianshu.com/p/30043bcc90b6 1、创建FocalLoss.py文件,添加一下代码 代码修改处: classnum 处改为你分类的数量 P = F.softmax(inputs) 改为 P = F.softmax(inputs,dim=1) import torch import torch.nn as nn import torch.nn.functional as F fr

qq_36414085的博客 6793

【机器学习】focalloss原理以及pytorch实现

最近在做一个分类项目,发现很多“难样本”比较不好处理又特别重要,想试试FocalLoss。没找到pytorch相关实现,本来想研究pytorch的cross_entropy源码,稍微改一下(怕手残自己写的loss效率比较低),但是发现有点复杂,我的任务比较简单,改那玩意有点累。 我们知道,对于二分类: cross_entropy(y,y^)=−ylogy^−(1−y)log1−y^ cross\_...

weixin_39982211的博客 1663

关于使用dl-utils中的focalloss时的问题-pytorch

这个包主要包含损失函数、模型定义和指标,包括函数式和模块化以及(只要可能)纯PyTorch实现。有两种安装方式。

2301_79853469的博客 336

手撕FocalLoss

为了加深对Focal Loss理解,本文提供了一个简单的手写Demo。根据真实标签yyy的不同,Focal Loss 可以分为两种情况:1) 当真实标签y1y = 1y1FLp−α1−pγlog⁡pFLp−α1−pγlogp2) 当真实标签y0y = 0y0FLp−1−αpγ。

wulele2的博客 1385

深度学习项目训练环境损失函数:支持CrossEntropy/FocalLoss/LabelSmoothing灵活切换

本文介绍了如何在星图GPU平台上自动化部署深度学习项目训练环境镜像,实现CrossEntropy、FocalLoss和LabelSmoothing等损失函数的灵活切换。该环境支持图像分类等深度学习任务,特别适用于处理类别不平衡数据和提升模型泛化能力,帮助开发者快速进行模型训练与效果对比。

weixin_42360846的博客 39

交叉熵、Focal Loss以及其Pytorch实现

这到底是怎么做到的呢?下调权重是一种技术,它可以减少容易的例子对损失函数的影响,从而使人们更加关注困难的例子。Focal Loss自然地解决了阶级不平衡的问题,(1因为来自多数类别的例子通常容易预测,而来自少数类别的例子由于缺乏数据或来自多数类别的例子在损失和梯度过程中占主导地位而难以预测。Focal loss关注的是模型出错的例子,而不是它可以自信地预测的例子,确保对困难的例子的预测随着时间的推移而改善,而不是对容易的例子变得过于自信。不同损失函数有着不同的约束作用,不同的数据对损失函数有着不同的影响。

qq_43428929的博客 4361

CrossEntropyLoss和FocalLoss学习记录

FocalLoss详解及实践记录

qq_37053918的博客 1254
上一篇: 【Git】回滚旧提交版本且不影响最新提交版本
下一篇: 智谱AI——智能体开发探索
Mocode
博客等级 码龄7年 335粉丝 53原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值