【MMDetection 系列:三】Loss 函数详解 + Pytorch 实现
Reference
https://zhuanlan.zhihu.com/p/40284001
https://blog.csdn.net/weixin_41665360/article/details/100126744
https://github.com/open-mmlab/mmdetection
https://github.com/thangvubk/Cascade-RPN (based on mmdetection framework)
Deep Learning v1 笔记
MMDetection 中 Loss 函数详解
- Reference
- 基本 loss
- MSE —— 回归loss
- SSE
- MSE
- RMSE
- 0-1 Loss
- hinge loss
- L1 loss
- L2 Loss
- 分类 loss CE
- CE
- Binary CE loss
- Balanced CE loss
- Focal Loss
- ghm loss
- 回归 loss —— L1
- Smooth L1 loss (回归常用)
- Balance L1 loss
- Bounded IOU loss
- 回归 loss —— IoU
- IOU Loss
- GIOU-loss
- Linear IOU Loss
- 分类概率
- softmax (多分类)
- Sigmoid (二分类)
一个函数能够作为损失函数,要符合以下两个特性:
- 非负
- 当实际输出接近预期,那么损失函数应该接近0
基本 loss
MSE —— 回归loss
参考KL散度
MSE 回归loss ,更适合用来预测值。而CE是衡量两个分布距离的指标
SSE
和方差
- 该参数计算的是拟合数据和原始对应点的误差的平方和
是真实数据,
是拟合的数据,
,从这里可以看出SSE接近于0,说明模型选择和拟合更好,数据预测也越成功。
MSE
均方方差
- 预测数据和原始数据对应点误差的平方和的均值
缺点
- 其偏导值在输出概率值接近0或者接近1的时候非常小,这可能会造成模型刚开始训练时,偏导值几乎消失。
import torch.nn.functional as F
mse_loss = weighted_loss(F.mse_loss)
RMSE
也叫回归系统的拟合标准差,是MSE的平方根,计算公式为:
0-1 Loss
0-1损失函数直接对应分类判断错误的个数,但是它是一个非凸函数,不太适用.
hinge loss
Hinge Loss常作为 SVM 的损失函数
L1 loss
L2 Loss
L2-loss 比 L1-loss 好,因为L2-loss的收敛速度要比L1-loss要快得多。
缺点:
- 当存在离群点(outliers)的时候,这些点会占loss的主要组成部分
比如说真实值为1,预测10次,有一次预测值为1000,其余次的预测值为1左右,显然loss值主要由1000主宰
不管是L1损失函数,还是L2损失函数,都有两大缺陷:
- 假定噪声的影响和图像的局部特性是独立的。然而,人类的视觉系统对噪声的感知受局部照度、对比、结构的影响。
- 假定噪声接近高斯白噪声,然而这一假定并不总是成立。
分类 loss CE
CE
Cross - Entropy
交叉熵
表示样本,
表示预测的输出,
表示实际的输出,
表示样本总数量
- 对数似然函数,可用于二分类和多分类任务中
- 二分类问题中的loss函数(输入数据是softmax或者sigmoid函数的输出)
- 多分类问题中的loss函数(输入数据是softmax或者sigmoid函数的输出)
交叉熵
def cross_entropy(pred, label, weight=None, reduction='mean', avg_factor=None):# element-wise lossesloss = F.cross_entropy(pred, label, reduction='none')# apply weights and do the reductionif weight is not None:weight = weight.float()loss = weight_reduce_loss(loss, weight=weight, reduction=reduction, avg_factor=avg_factor)return loss
Binary CE loss
二分类
def binary_cross_entropy(pred,label,weight=None,reduction='mean',avg_factor=None):if pred.dim() != label.dim():label, weight = _expand_binary_labels(label, weight, pred.size(-1))# weighted element-wise lossesif weight is not None
本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!
