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_averagereduce已经弃用。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_averagereduce已经弃用。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_averagereduce已经弃用。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 ​

对比SmoothL1LossHuberLoss公式可知,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相关推荐

  1. 【Dual-Path-RNN-Pytorch源码分析】loss函数:SI-SNR

    DPRNN使用的loss函数是 SI-SNR SI-SNR 是scale-invariant source-to-noise ratio的缩写,中文翻译为尺度不变的信噪比,意思是不受信号变化影响的信噪 ...

  2. tensorflow学习(4.loss函数以及正则化的使用 )

    本文还是以MNIST的CNN分析为例 loss函数一般有MSE均方差函数.交叉熵损失函数,说明见 https://blog.csdn.net/John_xyz/article/details/6121 ...

  3. 多分类loss函数本质理解

    一.面对一个多分类问题,如何设计合理的损失函数呢? 1.损失函数的本质在数学上称为目标函数:这个目标函数的目标值符合最完美的需求:损失函数的目标值肯定是0,完美分类的损失必然为0 : 2.损失函数分为 ...

  4. 深度学习基础(三)loss函数

    loss函数,即损失函数,是决定网络学习质量的关键.若网络结构不变的前提下,损失函数选择不当会导致模型精度差等后果.若有错误,敬请指正,Thank you! 目录 一.loss函数定义 二.常见的lo ...

  5. Keras自定义Loss函数

    Keras作为一个深度学习库,非常适合新手.在做神经网络时,它自带了许多常用的目标函数,优化方法等等,基本能满足新手学习时的一些需求.具体包含目标函数和优化方法.但它也支持用户自定义目标函数,下边介绍 ...

  6. 商汤使用AutoML设计Loss函数,全面超越人工设计

    点击我爱计算机视觉标星,更快获取CVML新技术 深度学习领域,神经架构搜索得到的算法如雨后春笋般出现. 今天一篇arXiv论文<AM-LFS: AutoML for Loss Function ...

  7. 深度学习中的损失函数总结以及Center Loss函数笔记

    北京 上海巡回站 | NVIDIA DLI深度学习培训 2018年1月26/1月12日 NVIDIA 深度学习学院 带你快速进入火热的DL领域 阅读全文                        ...

  8. 'int' object has no attribute 'backward'报错 使用Pytorch编写 Hinge loss函数

    在编写SVM中的Hinge loss函数的时候报错"'int' object has no attribute 'backward'" for epoch in range(50) ...

  9. 《深度学习笔记》——loss函数的学习笔记

    1 loss的作用 在南溪看来,loss函数是对目标target和预测prediction之间的一种距离度量的公式: 2 loss函数的设计原则 此设计原则参考了距离的定义,(注意:距离跟范数是两个概 ...

最新文章

  1. wifi共享大师电脑版_手机开wifi热点,共享网络给电脑,变身4G无线路由器
  2. 源码分析RocketMQ ACL实现机制
  3. wtc java 代码 tpcall(servicename_通过wtc使tuxedo及weblogic通信开发.doc
  4. 和浏览器并发请求数有关的一些前端技术
  5. Netty5 Write和Flush事件处理过程_源码讲解
  6. html5中怎么实现外边框中嵌入字_Web前端有什么优点?Web前端怎么入门?
  7. 【深度学习】线性分类器 - 上
  8. Python 计算平方数
  9. BFD1从北京顺义新国展到酒仙桥特斯拉办公室
  10. 国际标准组织 ISO 3166 的国家或地区代码
  11. 我们会是最后一批用五笔的中国人吗?
  12. 蓝桥杯Python组的规矩
  13. hive启动报错:Relative path in absolute URI:${system:java.io.tmpdir%7D/$%7Bsystem:user.name%7D
  14. 你应该解雇工作狂程序员的5个原因
  15. Java实现七牛云文件或图片上传下载
  16. 车托帮APP的顽固残留清除
  17. TigerGraph Cloud 使用,以及Python的链接操作
  18. amr文件怎么转换成mp3,实用教程
  19. 破解字体加密解决思路
  20. Kibana:如何在可视化中显示百分比数据

热门文章

  1. Jquery调用Web Service
  2. Hessian 3.2.0的两个bug(转)
  3. 性能测试系列:高可用测试linux常用命令
  4. 工作中遇到的问题——数据库
  5. Git21天打卡day9-查看远程仓库分支git branch -a
  6. 软件测试:做一些简单工作经历总结,自己想到那算那吧
  7. 你该怎么去学软件测试,过来人告诉你
  8. 《我的第一本算法书》读书笔记
  9. Endnote在word中每次启动都要加载,或者无法加载的解决办法
  10. java操作mysql数据库实例_jdbc操作mysql数据库实例