1.关于Focal loss损失函数的函数函数代码实现
2.常见的损失函数(loss function)
3.损失函数(Loss Function)
4.CenterNet之loss计算代码解析
5.BCE loss function 介绍
6.PyTorch中的损失函数--L1Loss /L2Loss/SmoothL1Loss
关于Focal loss损失函数的代码实现
Focal loss的公式:其中用到的交叉熵损失函数表达式是(3)
[公式] 其中:
[公式]
1 focal loss的公式推导过程理解可以参考:寻找解决样本不均衡方法之Focal Loss与GHM - 知乎 (zhihu.com)
2 交叉熵损失函数的推导过程可以参考:交叉熵损失函数 - 知乎 (zhihu.com)
3 CE与BCE的区别:CE Loss 与 BCE Loss 区别 - 知乎 (zhihu.com)
BCE:二分类
[公式]
[公式]
CE:多分类,当其是源码二分类时候与BCE有什么区别可见上面的链接
[公式]
[公式]
pytorch中具体实现方法可以查看:CrossEntropyLoss — PyTorch 1. documentation
[公式] [公式] [公式]
代码来源:Focal Loss代码分析(公式修改版-知乎公式坑) - 知乎 (zhihu.com)
代码实现的原理如下:
pytorch中交叉熵损失函数所有表达式,类比(3)
[公式] α-balanced交叉熵结合表达式
[公式] focal loss表达式:
[公式] 带有alpha平衡参数的常用focal loss表达式:
[公式] 将CrossEntropyLoss改成Focal Loss
[公式] 那么:
[公式] 所有Focal loss的最终为
[公式] 当然考虑到是mini-batch算法,因此最后一步取均值运算。函数函数
关于使用CE与BCE的源码实现方法可以参考以下代码:(关于γ与α的调参也有部分解答)
一、Focal Loss理论及代码实现_MY头发乱了的常用口红机源码分析博客-CSDN博客_focal loss代码实现
基于二分类交叉熵实现
其他的参考资料
关于binary_cross_entropy_with_logits与binary_cross_entropy的区别可以看:
pytorch损失函数binary_cross_entropy和binary_cross_entropy_with_logits的区别_czg的博客-CSDN博客_binary_cross_entropy torch
关于focal loss二分类公式的一些变形可以参考:
论文解读Focal Loss公式、导数、函数函数作用详解 - 知乎 (zhihu.com)
使用纯pytorch代码实现focal loss
Focal Loss 的源码Pytorch 实现以及实验 - 知乎 (zhihu.com)
辅助理解代码实现:
深度学习之目标检测(五)-- RetinaNet网络结构详解_木卯_THU的博客-CSDN博客_retinanet
focal loss原理及简单代码实现_pomelo的博客-CSDN博客_focal loss代码实现
吃透torch.nn.CrossEntropyLoss() - 知乎 (zhihu.com)
格式比较工整一些的可以看:
关于Focal loss损失函数的代码实现_Lian_Ge_Blog的博客-CSDN博客
常见的损失函数(loss function)
本文主要介绍机器学习和深度学习中常见的损失函数。
分类损失函数包括Hinge损失、常用指数损失、函数函数交叉熵损失等。源码Hinge损失常用于支持向量机(SVM),常用它对正确分类的函数函数样本不敏感,关注错误分类或分类置信度不足的源码样本。指数损失在AdaBoost算法中使用,常用对错误分类的样本特别敏感。交叉熵损失是深度学习中最常用的分类损失函数,用于衡量模型预测概率与真实标签的差异。
二分类交叉熵损失公式为:f(x)是模型预测类别为y的概率。多分类交叉熵损失函数的公式稍微复杂,涉及对每个类别的概率计算。sigmoid损失函数使用交叉熵损失而不是平方损失,因为交叉熵在误差较大时梯度较大,有助于快速收敛,而误差小时梯度较小,可得到较好的最优解。
Focal损失是加权的二分类交叉熵损失,旨在解决样本不均衡和困难样本学习问题。它通过调整样本权重,对难样本给予更多关注,以优化模型性能。手机网页源码修改对比损失(constrastive loss)最初用于孪生网络,鼓励同类样本距离较小,不同类样本距离较大。Triplet损失是对比损失的拓展,用于特征提取和距离度量,确保锚点样本与其同类样本距离近,与不同类样本距离远。
回归损失包括L1损失(绝对值损失)、L2损失(MSE,平方差损失)、Huber损失(平滑L1损失)等。L1损失在计算绝对值时可求导,L2损失对离群点敏感,Huber损失结合了两者优点,平滑处理了在0点附近的损失计算。
BCE损失(二元交叉熵损失)用于二分类问题,特别适用于前背景分割、语义分割任务。Dice损失常用于医学图像分割,衡量模型输出与实际图像的相似性。Total Variance损失衡量图像平滑性,有助于减少噪声影响。Perceptual损失通过预训练特征提取器比较生成图像与真实图像的相似性,提高图像生成的逼真度。
分布损失函数如KL散度损失、JS散度等,用于衡量真实分布与模型预测分布之间的差异。在分类任务中,通常使用交叉熵损失而非KL散度损失,因为KL散度涉及事件熵,前端工具箱源码而分类任务中的熵通常保持不变。而JS散度用于解决KL散度的不对称性问题。
对于生成对抗网络(GAN)的损失函数,原始形式在最小化JS散度。辨别器损失和生成器损失分别定义为:辨别器通过计算真实样本与生成样本的差异,生成器则试图逼近真实样本分布,从而实现图像生成的优化。
least square GAN损失形式对辨别器和生成器的损失计算进行了调整,通过改变损失函数的形式,优化训练过程的梯度表现,尤其是在训练初期,有助于提升模型的训练效率和生成图像的质量。
损失函数(Loss Function)
损失函数(loss function)在机器学习中扮演着至关重要的角色,用以度量预测值与真实值之间的差异。本文将详细介绍几种常见损失函数的原理、性能特点和适用范围,以帮助读者更好地理解它们在不同场景下的应用。一、什么是损失函数?
损失函数是衡量模型预测准确性的一个关键指标。它是一个非负实值函数,用于计算模型输出与实际目标值之间的差距。损失函数值越小,表明模型的预测性能越好,鲁棒性越强。通过优化损失函数,机器学习模型能够调整参数,以减少预测误差,最终实现更准确的预测。
二、损失函数的购物导航网站源码作用
损失函数主要用于监督学习的训练阶段。在训练过程中,模型接收批次数据,并通过前向传播生成预测值。接下来,损失函数计算预测值与实际值之间的差距,形成损失值。模型利用反向传播算法,通过调整参数以降低损失值,从而使预测值更接近实际值。这一过程不断迭代,直至模型性能达到满意水平。三、常用损失函数介绍
1. 基于距离度量的损失函数
这类损失函数通过将输入数据映射到距离度量的空间中,如欧氏空间或汉明空间,比较样本在特征空间中的真实值与预测值之间的距离。距离越小,模型性能越好。 均方误差损失函数(MSE):用于回归问题,度量样本点与回归曲线之间的距离。MSE值越小,表示预测模型具有更高的精确度。尽管在图像和语音处理中表现较弱,MSE仍作为标准性能指标。 L2损失函数:也称为欧氏距离,用于度量数据点的相似度。L2损失在回归问题、模式识别和图像处理中应用广泛,因为它具有凸性和可微性。 L1损失函数:表示残差的绝对值之和。L1损失对离群点具有鲁棒性,水滴微信平台源码但更新梯度可能较大,不利于模型收敛。 Smooth L1损失函数:结合了平方损失和绝对损失的优点,减少梯度爆炸问题,适用于目标检测等领域。 Huber损失函数:结合了MSE和绝对损失的特性,具有连续导数,能有效处理异常点,但参数选择可能增加训练难度。2. 基于概率分布度量的损失函数
这类损失函数将样本相似性转化为概率分布之间的距离,用于度量真实分布与预测分布之间的差异。常见于涉及概率分布或预测类概率的应用问题,如分类问题。 KL散度函数(相对熵):衡量两个概率分布之间的距离,越小表示越相似。适用于文本标签或图像相似性比较。 交叉熵损失:用于衡量预测概率分布与实际分布之间的差异,是分类问题中最常用的损失函数之一。 Softmax损失函数:用于多分类任务,将预测概率映射到概率分布,常用于卷积神经网络模型。 Focal损失:解决难易样本不均衡问题,通过调整难分样本的损失值,提升模型性能。四、如何选择损失函数?
选择损失函数时,应考虑以下几个方面: 基于主要特征构建距离或概率分布度量的空间。 采用合理的特征归一化方法,保持数据核心内容。 根据实验结果调整参数,优化损失函数。 合理组合不同损失函数,发挥各自优势。 将数据特征嵌入损失函数,提高模型预测精度。CenterNet之loss计算代码解析
本文主要解析CenterNet的loss计算机制。CenterNet基于编码解码结构,输出包含关键点的热图heatmap、中心点的长宽预测值以及中心点的偏差。
在loss计算中,heatmap loss是关键部分,用于定位关键点。其输入为图像,输出为关键点热图,网络输出的关键点热图heatmap,公式中R代表输出相对于原图的步长stride,C代表类别个数。损失公式与Focal loss形式相似,通过超参数调整易分样本和难分样本的损失比重,A区(预测值接近1)和B区(预测值接近0)损失不同,通过高斯核生成的中心进行区分,确保预测准确。
偏置部分(offset loss)通过引入偏置值和损失值,减小输出特征图的空间分辨率变化带来的误差。偏置值通过L1 loss进行训练,公式中R代表下采样倍数,[公式]和[公式]代表偏差值。
宽高预测部分(wh loss)对目标框的长和宽进行训练,公式中k表示目标,C表示类别,[公式]和[公式]为网络输出结果。
整体损失函数是三部分loss的综合,并分配了不同的权重。
在代码实现中,训练过程从第行开始进行loss计算,调用transpose_and_gather_feature函数获取ground truth中计算得到的对应中心点的值。heatmap loss代码与公式对应,通过pos和neg样本区分损失。偏置和宽高预测的loss代码通过调用_reg_loss函数进行计算。
综上,CenterNet通过综合考虑位置、偏置和大小预测的损失,确保目标检测的准确性。代码解析展示了在实际训练过程中如何实现这些loss计算逻辑。
BCE loss function 介绍
本文将介绍binary cross entropy loss在二分类任务中的应用。此损失函数的定义如下:
Loss = -p*log(q) - (1-p)*log(1-q)
其中,p代表标签概率,而q是预测样本的概率。此公式反映了预测结果与实际结果之间的差距。
在PyTorch中,用户可以调用相应接口实现此损失函数的计算,具体为:
BCELoss - PyTorch 1. documentation
用户还可以选择自定义bce损失函数,以实现更清晰的代码理解。对比两种实现方式,主要区别在于是否在内部使用sigmoid函数,这直接影响了损失函数的计算过程和优化效果。
总之,binary cross entropy loss在二分类任务中具有广泛应用,通过合理选择实现方式,可以有效提升模型性能。
PyTorch中的损失函数--L1Loss /L2Loss/SmoothL1Loss
L1Loss,也称为MAE,是通过计算目标值与模型输出之间的绝对误差来衡量损失的。公式为 |y_true - y_pred|。
L2Loss,常称为MSE,在PyTorch中被称为torch.nn.MSELoss,是通过计算目标值与模型输出之间的差值平方来衡量损失的。公式为 (y_true - y_pred)^2。
SmoothL1Loss是一种平滑版本的L1Loss,它在预测值和ground truth之间的差别较小时使用L2Loss,在差别较大时使用L1Loss。公式为 max(0.5*(|y_true - y_pred|)^2, |y_true - y_pred| - 0.5)。优点是当预测值和ground truth差别较小时,梯度不至于太大,损失函数较为平滑;当差别大时,梯度值足够小,稳定不易出现梯度爆炸。
在PyTorch中,所有的损失函数都包含size_average参数,默认为True。当size_average设置为True时,计算出的结果会取mini-batch的平均值。如果设置为False,计算出的损失值不会除以n。
交叉熵损失函数(CrossEntropy Loss)
交叉熵损失函数在机器学习中扮演核心角色,用于度量真实概率分布与预测概率分布之间的差异,其值越小,表示模型预测效果越好。以二分类交叉熵为例,具体公式如下:
\[Loss = -1/2(1*log0.7 + 1*log0.2)\]
在此公式中,X表示样本等于特定类别的概率向量,Y为样本的标签,此例中Y为[1,0],计算交叉熵损失。
对于多分类问题,交叉熵公式为:
\[Loss = -1/2(log0.7+log0.5)\]
在交叉熵定义中,M代表类别总数,i表示第i个样本,yic表示第i个样本类别c的标签,pic为第i个样本类别c的概率。
交叉熵与相对熵(KL散度)关系紧密,二者在机器学习中用途相辅相成。训练数据分布A与模型输出分布B的KL散度可表示为:
\[KL散度=A的熵-AB的交叉熵\]
由于在机器学习中,训练数据分布是固定的,因此最大化相对熵(KL散度)等同于最小化交叉熵,与极大似然估计一致。
分类问题中,交叉熵与极大似然估计目标一致。最小化交叉熵实质上是最小化实际与预估之间的差距,这与极大似然估计的目标相符,只是符号上的差异导致一个为最小化(交叉熵),另一个为最大化(最大似然)。
为何在分类问题中不能使用均方误差(MSE)而使用交叉熵?原因有三:
1. 从最优化角度:MSE对于输出范围为实数的函数是凸的,而分类问题通常涉及sigmoid或softmax激活函数,其输出范围受限。这种限制会导致MSE函数非凸,出现多个极值点,不利于优化。
2. 从梯度角度:以sigmoid激活函数为例,使用均方误差作为损失函数时,对参数的偏导受到激活函数导数的影响,导致梯度不稳定。而交叉熵损失函数对参数的偏导则不受激活函数导数影响,保证了梯度的稳定。
3. 从含义角度:交叉熵注重真实概率分布与预测概率分布的差异,分类问题的目标是使模型输出接近训练数据分布。这与均方误差代表的欧氏距离无关,因此交叉熵更适用于分类问题。
交叉熵损失函数虽有其优势,但也有不足。优点在于,它在更新权重时,权重的梯度与激活函数的梯度无关,预测值与实际值差距越大,参数调整越快,收敛越快。而MSE存在多处局部最小点,交叉熵则不存在此问题。缺点在于,交叉熵采用类间竞争机制,专注于正确标签预测概率的准确性,忽略了非正确标签的差异,可能导致学习到的特征分散。