最全的损失函数汇总

部署运行你感兴趣的模型镜像

作者:mingo_敏

编辑:深度学习自然语言处理

链接:

https://blog.youkuaiyun.com/shanglianlm/article/details/85019768

tensorflow和pytorch很多都是相似的,这里以pytorch为例。

19种损失函数

1. L1范数损失 L1Loss

计算 output 和 target 之差的绝对值。

torch.nn.L1Loss(reduction='mean')

参数:

reduction-三个值,none: 不使用约简;mean:返回loss和的平均值;sum:返回loss的和。默认:mean。

2 均方误差损失 MSELoss

计算 output 和 target 之差的均方差。

torch.nn.MSELoss(reduction='mean')

参数:

reduction-三个值,none: 不使用约简;mean:返回loss和的平均值;sum:返回loss的和。默认:mean。

3 交叉熵损失 CrossEntropyLoss

当训练有 C 个类别的分类问题时很有效. 可选参数 weight 必须是一个1维 Tensor, 权重将被分配给各个类别. 对于不平衡的训练集非常有效。

在多分类任务中,经常采用 softmax 激活函数+交叉熵损失函数,因为交叉熵描述了两个概率分布的差异,然而神经网络输出的是向量,并不是概率分布的形式。所以需要 softmax激活函数将一个向量进行“归一化”成概率分布的形式,再采用交叉熵损失函数计算 loss。

torch.nn.CrossEntropyLoss(weight=None,ignore_index=-100, reduction='mean')

参数:

weight (Tensor, optional) – 自定义的每个类别的权重. 必须是一个长度为 C 的 Tensor

ignore_index (int, optional) – 设置一个目标值, 该目标值会被忽略, 从而不会影响到 输入的梯度。

reduction-三个值,none: 不使用约简;mean:返回loss和的平均值;sum:返回loss的和。默认:mean。

4 KL 散度损失 KLDivLoss

计算 input 和 target 之间的 KL 散度。KL 散度可用于衡量不同的连续分布之间的距离, 在连续的输出分布的空间上(离散采样)上进行直接回归时 很有效.

torch.nn.KLDivLoss(reduction='mean')

参数:

reduction-三个值,none: 不使用约简;mean:返回loss和的平均值;sum:返回loss的和。默认:mean。

5 二进制交叉熵损失 BCELoss

二分类任务时的交叉熵计算函数。用于测量重构的误差, 例如自动编码机. 注意目标的值 t[i] 的范围为0到1之间.

torch.nn.BCELoss(weight=None, reduction='mean')

参数:

weight (Tensor, optional) – 自定义的每个 batch 元素的 loss 的权重. 必须是一个长度为 “nbatch” 的 的 Tensor

6 BCEWithLogitsLoss

BCEWithLogitsLoss损失函数把 Sigmoid 层集成到了 BCELoss 类中. 该版比用一个简单的 Sigmoid 层和 BCELoss 在数值上更稳定, 因为把这两个操作合并为一个层之后, 可以利用 log-sum-exp 的 技巧来实现数值稳定.

torch.nn.BCEWithLogitsLoss(weight=None, reduction='mean', pos_weight=None)

参数:

weight (Tensor, optional) – 自定义的每个 batch 元素的 loss 的权重. 必须是一个长度 为 “nbatch” 的 Tensor

7 MarginRankingLoss
torch.nn.MarginRankingLoss(margin=0.0, reduction='mean')

对于 mini-batch(小批量) 中每个实例的损失函数如下:

参数:

margin:默认值0


8 HingeEmbeddingLoss
torch.nn.HingeEmbeddingLoss(margin=1.0,  reduction='mean')

对于 mini-batch(小批量) 中每个实例的损失函数如下:

参数:

margin:默认值1

9 多标签分类损失 MultiLabelMarginLoss
torch.nn.MultiLabelMarginLoss(reduction='mean')

对于mini-batch(小批量) 中的每个样本按如下公式计算损失:

10 平滑版L1损失 SmoothL1Loss

也被称为 Huber 损失函数。

torch.nn.SmoothL1Loss(reduction='mean')


其中

11 2分类的logistic损失 SoftMarginLoss
torch.nn.SoftMarginLoss(reduction='mean')



12 多标签 one-versus-all 损失 MultiLabelSoftMarginLoss
torch.nn.MultiLabelSoftMarginLoss(weight=None, reduction='mean')


13 cosine 损失 CosineEmbeddingLoss
torch.nn.CosineEmbeddingLoss(margin=0.0, reduction='mean')


参数:

margin:默认值0

14 多类别分类的hinge损失 MultiMarginLoss
torch.nn.MultiMarginLoss(p=1, margin=1.0, weight=None,  reduction='mean')


参数:

p=1或者2 默认值:1
margin:默认值1

15 三元组损失 TripletMarginLoss

和孪生网络相似,具体例子:给一个A,然后再给B、C,看看B、C谁和A更像。

torch.nn.TripletMarginLoss(margin=1.0, p=2.0, eps=1e-06, swap=False, reduction='mean')


其中:

16 连接时序分类损失 CTCLoss

CTC连接时序分类损失,可以对没有对齐的数据进行自动对齐,主要用在没有事先对齐的序列化数据训练上。比如语音识别、ocr识别等等。

torch.nn.CTCLoss(blank=0, reduction='mean')

参数:

reduction-三个值,none: 不使用约简;mean:返回loss和的平均值;sum:返回loss的和。默认:mean。

17 负对数似然损失 NLLLoss

负对数似然损失. 用于训练 C 个类别的分类问题.

torch.nn.NLLLoss(weight=None, ignore_index=-100,  reduction='mean')

参数:

weight (Tensor, optional) – 自定义的每个类别的权重. 必须是一个长度为 C 的 Tensor

ignore_index (int, optional) – 设置一个目标值, 该目标值会被忽略, 从而不会影响到 输入的梯度.

18 NLLLoss2d

对于图片输入的负对数似然损失. 它计算每个像素的负对数似然损失.

torch.nn.NLLLoss2d(weight=None, ignore_index=-100, reduction='mean')

参数:

weight (Tensor, optional) – 自定义的每个类别的权重. 必须是一个长度为 C 的 Tensor

reduction-三个值,none: 不使用约简;mean:返回loss和的平均值;sum:返回loss的和。默认:mean。

19 PoissonNLLLoss

目标值为泊松分布的负对数似然损失

torch.nn.PoissonNLLLoss(log_input=True, full=False,  eps=1e-08,  reduction='mean')

参数:

log_input (bool, optional) – 如果设置为 True , loss 将会按照公 式 exp(input) - target * input 来计算, 如果设置为 False , loss 将会按照 input - target * log(input+eps) 计算.

full (bool, optional) – 是否计算全部的 loss, i. e. 加上 Stirling 近似项 target * log(target) - target + 0.5 * log(2 * pi * target).

eps (float, optional) – 默认值: 1e-8

您可能感兴趣的与本文相关的镜像

PyTorch 2.5

PyTorch 2.5

PyTorch
Cuda

PyTorch 是一个开源的 Python 机器学习库,基于 Torch 库,底层由 C++ 实现,应用于人工智能领域,如计算机视觉和自然语言处理

### YOLO模型中的损失函数总结 YOLO(You Only Look Once)是一种实时目标检测算法,其核心在于通过单一神经网络完成边界框预测和类别概率估计的任务。以下是YOLO模型中常用的几种损失函数及其计算方法: #### 1. 定位损失 (Localization Loss) 定位损失用于衡量预测框与真实框之间的偏差,主要针对中心点坐标 \( b_x, b_y \) 和宽度高度 \( b_w, b_h \) 的差异。 - **YOLOv1**: 使用均方误差(Mean Squared Error, MSE)作为定位损失的计算方式。对于每个网格单元格内的多个边界框预测,仅考虑负责该对象的最佳边界框。 \[ L_{\text{loc}} = \lambda_{coord} \sum_{i=0}^{S^2} \sum_{j=0}^{B} \mathbb{I}_{ij}^{obj} \left( (x_i - \hat{x}_i)^2 + (y_i - \hat{y}_i)^2 + (\sqrt{w_i} - \sqrt{\hat{w}_i})^2 + (\sqrt{h_i} - \sqrt{\hat{h}_i})^2 \right)[^1] \] - **YOLOv3**: 同样使用MSE来评估位置偏移量,但在处理宽高时重新引入了平方根操作以平衡大框和小框的影响[^2]。 ```python loss_x = mse_loss(x[obj_mask], tx[obj_mask]) loss_y = mse_loss(y[obj_mask], ty[obj_mask]) loss_w = mse_loss(torch.sqrt(w[obj_mask]), torch.sqrt(tw[obj_mask])) loss_h = mse_loss(torch.sqrt(h[obj_mask]), torch.sqrt(th[obj_mask])) ``` --- #### 2. 置信度损失 (Confidence Loss) 置信度损失用来判断某个边界框是否包含目标对象。它分为两部分:有目标的情况下的置信度损失和无目标情况下的置信度损失。 - **YOLOv1 & YOLOv3**: 对于有目标的部分,采用二元交叉熵(Binary Cross Entropy, BCE),而无目标的情况下则降低权重以减少背景噪声影响。 \[ L_{\text{conf}} = \lambda_{obj} \sum_{i=0}^{S^2} \sum_{j=0}^{B} \mathbb{I}_{ij}^{obj} \cdot BCE(\hat{C}, C) + \lambda_{noobj} \sum_{i=0}^{S^2} \sum_{j=0}^{B} \mathbb{I}_{ij}^{noobj} \cdot BCE(\hat{C}, C)[^1] \] 实现如下: ```python loss_conf_obj = bce_loss(pred_conf[obj_mask], tconf[obj_mask]) loss_conf_noobj = bce_loss(pred_conf[noobj_mask], tconf[noobj_mask]) loss_conf = obj_scale * loss_conf_obj + noobj_scale * loss_conf_noobj ``` --- #### 3. 分类损失 (Classification Loss) 分类损失用于确定边界框内所含对象的具体类别。 - **YOLOv1**: 使用Softmax对多类别进行建模并计算交叉熵损失。 \[ L_{\text{class}} = \sum_{i=0}^{S^2} \mathbb{I}_i^{obj} \cdot CE(p_i, \hat{p}_i)[^1] \] - **YOLOv3**: 改用独立的Logistic回归代替Softmax,适用于单标签或多标签场景,并同样基于BCE计算。 \[ L_{\text{cls}} = \sum_{i=0}^{S^2} \mathbb{I}_i^{obj} \cdot BCE(\hat{c}_i, c_i)[^2] \] 代码片段: ```python loss_cls = bce_loss(pred_cls[obj_mask], tcls[obj_mask]) ``` --- #### 4. 总体损失 (Total Loss) 总体损失由以上三部分加权组合而成: \[ L_{total} = L_{\text{loc}} + L_{\text{conf}} + L_{\text{cls}} \] 具体实现可以参考以下伪代码: ```python total_loss = loss_loc + loss_conf + loss_cls ``` --- ### 结论 YOLO系列模型通过对不同组件分配特定的损失函数实现了端到端的目标检测能力。其中,定位损失注重几何精度;置信度损失强调是否存在目标;分类损失则专注于识别准确性。这些设计共同构成了高效且鲁棒的目标检测框架。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值