loss函数之L1Loss,MSELoss,SmoothL1Loss, HuberLoss
L1Loss
平均绝对误差(MAE),用于回归模型
对于包含NNN个样本的batch数据 D(x,y)D(x, y)D(x,y),xxx为神经网络的输出,yyy是真实的得分,xxx与yyy同维度。
第nnn个样本的损失值lnl_{n}ln计算如下:
ln=∣xn−yn∣l_{n}=\left|x_{n}-y_{n}\right|ln=∣xn−yn∣
其中,yny_{n}yn代表第nnn样本的真实得分,可能对应一个值,也可能多个值,代表样本不同方面的得分,所以lnl_{n}ln可能是一个值,也可能是一个向量。
class L1Loss(_Loss):def __init__(self, size_average=None, reduce=None, reduction='mean'):super(L1Loss, self).__init__(size_average, reduce, reduction)def forward(self, input, target):return F.l1_loss(input, target, reduction=self.reduction)
pytorch中通过torch.nn.L1Loss
类实现,也可以直接调用F.l1_loss
函数,代码中的size_average
与reduce
已经弃用。reduction有三种取值mean
, sum
, none
,对应不同的返回ℓ(x,y)\ell(x, y)ℓ(x,y)。 默认为mean
,对LLL中所有元素求平均,对应于一般情况下的losslossloss的计算。
L={l1,…,lN}L=\left\{l_{1}, \ldots, l_{N}\right\}L={l1,…,lN}
ℓ(x,y)={L,if reduction =’none’ mean(L),if reduction =’mean’ sum(L),if reduction =’sum’ \ell(x, y)=\left\{\begin{array}{ll}\operatorname L, & \text { if reduction }=\text { 'none' } \\ \operatorname{mean}(L), & \text { if reduction }=\text { 'mean' } \\ \operatorname{sum}(L), & \text { if reduction }=\text { 'sum' }\end{array} \right.ℓ(x,y)=⎩⎨⎧L,mean(L),sum(L), if reduction = ’none’ if reduction = ’mean’ if reduction = ’sum’
MSELoss
均方误差(MSE),用于回归模型
对于包含NNN个样本的batch数据 D(x,y)D(x, y)D(x,y),xxx为神经网络的输出,yyy是真实的得分。
第nnn个样本的损失值lnl_{n}ln计算如下:
ln=(xn−yn)2l_{n}=\left(x_{n}-y_{n}\right)^{2}ln=(xn−yn)2
其中,yny_{n}yn代表第nnn样本的真实得分,可能对应一个值,也可能多个值,代表样本不同方面的得分,所以lnl_{n}ln可能是一个值,也可能是一个向量。
class MSELoss(_Loss):def __init__(self, size_average=None, reduce=None, reduction='mean'):super(MSELoss, self).__init__(size_average, reduce, reduction)def forward(self, input, target):return F.mse_loss(input, target, reduction=self.reduction)
pytorch中通过torch.nn.MSELoss
类实现,也可以直接调用F.mse_loss
函数。代码中的size_average
与reduce
已经弃用。reduction有三种取值mean
, sum
, none
,对应不同的返回ℓ(x,y)\ell(x, y)ℓ(x,y)。默认为mean
,对LLL中所有元素求平均,对应于一般情况下的losslossloss的计算。
L={l1,…,lN}L=\left\{l_{1}, \ldots, l_{N}\right\}L={l1,…,lN}
ℓ(x,y)={L,if reduction =’none’ mean(L),if reduction =’mean’ sum(L),if reduction =’sum’ \ell(x, y)=\left\{\begin{array}{ll}\operatorname L, & \text { if reduction }=\text { 'none' } \\ \operatorname{mean}(L), & \text { if reduction }=\text { 'mean' } \\ \operatorname{sum}(L), & \text { if reduction }=\text { 'sum' }\end{array} \right.ℓ(x,y)=⎩⎨⎧L,mean(L),sum(L), if reduction = ’none’ if reduction = ’mean’ if reduction = ’sum’
SmoothL1Loss
分段使用均方误差和平均绝对误差,用于回归模型
对于包含NNN个样本的batch数据 D(x,y)D(x, y)D(x,y),xxx为神经网络的输出,yyy是真实的得分。
第nnn个样本的损失值lnl_{n}ln计算如下:
ln={0.5(xn−yn)2/beta ,if ∣xn−yn∣<beta ∣xn−yn∣−0.5∗beta ,otherwise l_{n}=\left\{\begin{array}{ll}0.5\left(x_{n}-y_{n}\right)^{2} / \text { beta }, & \text { if }\left|x_{n}-y_{n}\right|<\text { beta } \\ \left|x_{n}-y_{n}\right|-0.5 * \text { beta }, & \text { otherwise }\end{array}\right.ln={0.5(xn−yn)2/ beta ,∣xn−yn∣−0.5∗ beta , if ∣xn−yn∣< beta otherwise
其中,yny_{n}yn代表第nnn样本的真实得分,可能对应一个值,也可能多个值,代表样本不同方面的得分,所以lnl_{n}ln可能是一个值,也可能是一个向量。
相比平均绝对误差,SmoothL1Loss平滑了∣xn−yn∣\left|x_{n}-y_{n}\right|∣xn−yn∣趋近于0时的误差。相比均方误差函数,SmoothL1Loss对离群点更不敏感。在一定程度上可以防止梯度爆炸问题。Fast R-CNN论文有详细论述。
class SmoothL1Loss(_Loss):def __init__(self, size_average=None, reduce=None, reduction: str = 'mean', beta: float = 1.0) -> None:super(SmoothL1Loss, self).__init__(size_average, reduce, reduction)self.beta = betadef forward(self, input: Tensor, target: Tensor) -> Tensor:return F.smooth_l1_loss(input, target, reduction=self.reduction, beta=self.beta)
pytorch中通过torch.nn.SmoothL1Loss
类实现,也可以直接调用F.smooth_l1_loss
函数。代码中的size_average
与reduce
已经弃用。reduction有三种取值mean
, sum
, none
,对应不同的返回ℓ(x,y)\ell(x, y)ℓ(x,y)。默认为mean
,对LLL中所有元素求平均,对应于一般情况下的losslossloss的计算。
L={l1,…,lN}L=\left\{l_{1}, \ldots, l_{N}\right\}L={l1,…,lN}
ℓ(x,y)={L,if reduction =’none’ mean(L),if reduction =’mean’ sum(L),if reduction =’sum’ \ell(x, y)=\left\{\begin{array}{ll}\operatorname L, & \text { if reduction }=\text { 'none' } \\ \operatorname{mean}(L), & \text { if reduction }=\text { 'mean' } \\ \operatorname{sum}(L), & \text { if reduction }=\text { 'sum' }\end{array} \right.ℓ(x,y)=⎩⎨⎧L,mean(L),sum(L), if reduction = ’none’ if reduction = ’mean’ if reduction = ’sum’
参数beta>=0beta>=0beta>=0,默认为1
HuberLoss
分段使用均方误差和平均绝对误差,用于回归模型
对于包含NNN个样本的batch数据 D(x,y)D(x, y)D(x,y),xxx为神经网络的输出,yyy是真实的得分。
第nnn个样本的损失值lnl_{n}ln计算如下:
ln={0.5(xn−yn)2,if ∣xn−yn∣<beta beta ∗(∣xn−yn∣−0.5∗beta ),otherwise l_{n}=\left\{\begin{array}{ll}0.5\left(x_{n}-y_{n}\right)^{2}, & \text { if }\left|x_{n}-y_{n}\right|<\text { beta } \\ \text { beta }*(\left|x_{n}-y_{n}\right|-0.5 * \text { beta }), & \text { otherwise }\end{array}\right.ln={0.5(xn−yn)2, beta ∗(∣xn−yn∣−0.5∗ beta ), if ∣xn−yn∣< beta otherwise
对比SmoothL1Loss
和HuberLoss
公式可知,HuberLoss=beta∗SmoothL1Loss\text {HuberLoss}= \text {beta}* \text {SmoothL1Loss}HuberLoss=beta∗SmoothL1Loss,两者有如下区别:
- 当betabetabeta趋于0时,
SmoothL1Loss
收敛于L1Loss
,HuberLoss
收敛于常数0 - 当betabetabeta趋于无穷时,
SmoothL1Loss
收敛于常数0,HuberLoss
收敛于MSELoss
- 随着betabetabeta的变化,
SmoothL1Loss
中平均绝对误差段的斜率恒定为1;而HuberLos
中平均绝对误差段的斜率是betabetabeta
SmoothL1Loss
例子:
import torch
import torch.nn as nn
import mathdef validate_loss(output, target, beta):val = 0for li_x, li_y in zip(output, target):for i, xy in enumerate(zip(li_x, li_y)):x, y = xyif math.fabs(x - y) < beta:loss_val = 0.5 * math.pow(x - y, 2) / betaelse:loss_val = math.fabs(x - y) - 0.5 * betaval += loss_valreturn val / output.nelement()beta = 1
loss_fct = nn.SmoothL1Loss(reduction="mean", beta=beta)
input_src = torch.Tensor([[0.8, 0.8], [0.9, 0.9], [0.3, 0.3]])
target = torch.Tensor([[0.6, 0.6], [0.7, 0.8], [0.4, 0.5]])
print(input_src.size())
print(target.size())
loss = loss_fct(input_src, target)
print(loss.item())validate = validate_loss(input_src, target, beta)
print(validate)loss_fct = nn.SmoothL1Loss(reduction="none", beta=beta)
loss = loss_fct(input_src, target)
print(loss)
输出结果:
torch.Size([3, 2])
torch.Size([3, 2])
0.01499999687075615
0.014999997715155441
tensor([[0.0200, 0.0200],[0.0200, 0.0050],[0.0050, 0.0200]])
loss函数之L1Loss,MSELoss,SmoothL1Loss, HuberLoss相关推荐
- 【Dual-Path-RNN-Pytorch源码分析】loss函数:SI-SNR
DPRNN使用的loss函数是 SI-SNR SI-SNR 是scale-invariant source-to-noise ratio的缩写,中文翻译为尺度不变的信噪比,意思是不受信号变化影响的信噪 ...
- tensorflow学习(4.loss函数以及正则化的使用 )
本文还是以MNIST的CNN分析为例 loss函数一般有MSE均方差函数.交叉熵损失函数,说明见 https://blog.csdn.net/John_xyz/article/details/6121 ...
- 多分类loss函数本质理解
一.面对一个多分类问题,如何设计合理的损失函数呢? 1.损失函数的本质在数学上称为目标函数:这个目标函数的目标值符合最完美的需求:损失函数的目标值肯定是0,完美分类的损失必然为0 : 2.损失函数分为 ...
- 深度学习基础(三)loss函数
loss函数,即损失函数,是决定网络学习质量的关键.若网络结构不变的前提下,损失函数选择不当会导致模型精度差等后果.若有错误,敬请指正,Thank you! 目录 一.loss函数定义 二.常见的lo ...
- Keras自定义Loss函数
Keras作为一个深度学习库,非常适合新手.在做神经网络时,它自带了许多常用的目标函数,优化方法等等,基本能满足新手学习时的一些需求.具体包含目标函数和优化方法.但它也支持用户自定义目标函数,下边介绍 ...
- 商汤使用AutoML设计Loss函数,全面超越人工设计
点击我爱计算机视觉标星,更快获取CVML新技术 深度学习领域,神经架构搜索得到的算法如雨后春笋般出现. 今天一篇arXiv论文<AM-LFS: AutoML for Loss Function ...
- 深度学习中的损失函数总结以及Center Loss函数笔记
北京 上海巡回站 | NVIDIA DLI深度学习培训 2018年1月26/1月12日 NVIDIA 深度学习学院 带你快速进入火热的DL领域 阅读全文 ...
- 'int' object has no attribute 'backward'报错 使用Pytorch编写 Hinge loss函数
在编写SVM中的Hinge loss函数的时候报错"'int' object has no attribute 'backward'" for epoch in range(50) ...
- 《深度学习笔记》——loss函数的学习笔记
1 loss的作用 在南溪看来,loss函数是对目标target和预测prediction之间的一种距离度量的公式: 2 loss函数的设计原则 此设计原则参考了距离的定义,(注意:距离跟范数是两个概 ...
最新文章
- wifi共享大师电脑版_手机开wifi热点,共享网络给电脑,变身4G无线路由器
- 源码分析RocketMQ ACL实现机制
- wtc java 代码 tpcall(servicename_通过wtc使tuxedo及weblogic通信开发.doc
- 和浏览器并发请求数有关的一些前端技术
- Netty5 Write和Flush事件处理过程_源码讲解
- html5中怎么实现外边框中嵌入字_Web前端有什么优点?Web前端怎么入门?
- 【深度学习】线性分类器 - 上
- Python 计算平方数
- BFD1从北京顺义新国展到酒仙桥特斯拉办公室
- 国际标准组织 ISO 3166 的国家或地区代码
- 我们会是最后一批用五笔的中国人吗?
- 蓝桥杯Python组的规矩
- hive启动报错:Relative path in absolute URI:${system:java.io.tmpdir%7D/$%7Bsystem:user.name%7D
- 你应该解雇工作狂程序员的5个原因
- Java实现七牛云文件或图片上传下载
- 车托帮APP的顽固残留清除
- TigerGraph Cloud 使用,以及Python的链接操作
- amr文件怎么转换成mp3,实用教程
- 破解字体加密解决思路
- Kibana:如何在可视化中显示百分比数据