PyTorch学习(5):损失函数

2023-05-16

PyTorch学习(5):损失函数

  • Pytorch官方文档: https://pytorch-cn.readthedocs.io/zh/latest/
  • Pytorch学习文档: https://github.com/tensor-yu/PyTorch_Tutorial
  • 参考: https://pytorch.org/docs/stable/nn.html
        https://pytorch-cn.readthedocs.io/zh/latest/package_references/torch-nn/#loss-functions
        https://blog.csdn.net/shanglianlm/article/details/85019768
        https://blog.csdn.net/u011995719/article/details/85107524

文章目录

  • PyTorch学习(5):损失函数
    • 1.基本用法
    • 2.损失函数
      • (1)L1 Loss
      • (2)MSELoss(L2 loss)
      • (3)CrossEntropyLoss
      • (4)BCELoss
      • (5)SmoothL1Loss
      • (6)其他的损失函数
  • 总结


1.基本用法

  定义完模型之后,需要通过torch.nn包来定义损失函数。常见的损失函数都已经定义在了torch.nn中,比如均方误差、多分类的交叉熵,以及二分类的交叉熵等等,调用这些定义好的损失函数的基本用法:

criterion = LossCriterion() #构造函数有自己的参数
loss = criterion(output, target) #调用标准时也有参数

计算出来的损失已经对mini-batch取了平均。

2.损失函数

(1)L1 Loss

CLASS torch.nn.L1Loss(size_average=None, reduce=None, reduction=‘mean’)
功能:
  计算模型预测输出output和目标target之差的绝对值,可选返回同维度的tensor或者是一个标量。
公式:
  在这里插入图片描述
参数:
  reduce(bool): 返回值是否为标量,默认为 True;
  size_average(bool): 当reduce=True时有效。为True时,返回的loss为平均值;为False时,返回的各样本的loss之和,将不会除以n。


(2)MSELoss(L2 loss)

CLASS torch.nn.MSELoss(size_average=None, reduce=None, reduction=‘mean’)
功能:
  计算模型预测输出output和目标target之差的平方,可选返回同维度的tensor或者是一个标量。
公式:
  在这里插入图片描述
参数:
  reduce(bool): 返回值是否为标量,默认为 True;
  size_average(bool): 当reduce=True时有效。为True时,返回的loss为平均值;为False
时,返回的各样本的 loss 之和将不会除以n。


(3)CrossEntropyLoss

CLASS torch.nn.CrossEntropyLoss(weight=None, size_average=None, ignore_index=-100,
reduce=None, reduction=‘mean’)

功能:
  将输入经过softmax激活函数之后,再计算其与target的交叉熵损失。即该方法将
nn.LogSoftmax()和nn.NLLLoss()进行了结合。
  当训练一个多类分类器的时候,这个方法是十分有用的。
参数:
  weight(tensor): 1-D tensor,n个元素,分别代表n类的权重,如果你的训练样本很不均衡的话,是非常有用的。默认值为None。
  size_average(bool): 当reduce=True时有效。为True时,返回的loss为平均值;为False时,返回的各样本的loss之和。
  reduce(bool): 返回值是否为标量,默认为True。
  ignore_index(int): 忽略某一类别,不计算其loss,其loss会为0,并且,在采用size_average时,不会计算那一类的loss,除的时候的分母也不会统计那一类的样本。
调用时参数:
  input: 包含每个类的得分,2-D tensor,shape为 batch*n;
  target: 大小为 n 的 1—D tensor,包含类别的索引(0到 n-1)。
公式:
  在这里插入图片描述
  当weight参数被指定的时候,loss的计算公式变为:
  在这里插入图片描述
  计算出的loss对mini-batch的大小取了平均。


(4)BCELoss

CLASS torch.nn.BCEWithLogitsLoss(weight=None, size_average=None, reduce=None,
reduction=‘mean’, pos_weight=None)

功能:
   二分类任务时的交叉熵计算函数。此函数可以认为是nn.CrossEntropyLoss函数的特例。其分类限定为二分类,y必须是{0,1}。
公式:
   在这里插入图片描述
   注: σ() 表示Sigmoid函数
参数:
   weight(Tensor): 为batch中单个样本设置权值。
   pos_weight: 正样本的权重, 当p>1,提高召回率,当P<1,提高精确度。可达到权衡召回率(Recall)和精确度(Precision)的作用。Must be a vector with length equal to the number of classes。
   size_average(bool): 当reduce=True时有效。为True时,返回的loss为平均值;为False时,返回的各样本的loss之和。
   reduce(bool): 返回值是否为标量,默认为True。


(5)SmoothL1Loss

CLASS torch.nn.SmoothL1Loss(size_average=None, reduce=None, reduction=‘mean’, beta=1.0)
功能:
   计算平滑L1损失,属于Huber Loss中的一种(因为参数δ固定为1了)。
补充:
   Huber Loss常用于回归问题,其最大的特点是对离群点(outliers)、噪声不敏感,具有较强的鲁棒性。
公式:
  在这里插入图片描述
  理解为,当误差绝对值小于δ,采用L2损失;若大于δ,采用L1损失。
参数:
  size_average(bool): 当reduce=True时有效。为True时,返回的loss为平均值;为False时,返回的各样本的loss之和。
  reduce(bool): 返回值是否为标量,默认为True。


(6)其他的损失函数

CLASStorch.nn.KLDivLoss(size_average=None, reduce=None, reduction='mean', log_target=False)
CLASStorch.nn.BCELoss(weight=None, size_average=None, reduce=None, reduction='mean')
CLASStorch.nn.MarginRankingLoss(margin=0.0, size_average=None, reduce=None, reduction='mean')
CLASStorch.nn.HingeEmbeddingLoss(margin=1.0, size_average=None, reduce=None, reduction='mean')
CLASStorch.nn.MultiLabelMarginLoss(size_average=None, reduce=None, reduction='mean')
CLASStorch.nn.SoftMarginLoss(size_average=None, reduce=None, reduction='mean')
CLASStorch.nn.MultiLabelSoftMarginLoss(weight=None, size_average=None, reduce=None, reduction='mean')
CLASStorch.nn.CosineEmbeddingLoss(margin=0.0, size_average=None, reduce=None, reduction='mean')
CLASStorch.nn.MultiMarginLoss(p=1, margin=1.0, weight=None, size_average=None, reduce=None, reduction='mean')
CLASStorch.nn.TripletMarginLoss(margin=1.0, p=2.0, eps=1e-06, swap=False, size_average=None, reduce=None, reduction='mean')
CLASStorch.nn.CTCLoss(blank=0, reduction='mean', zero_infinity=False)
CLASStorch.nn.NLLLoss(weight=None, size_average=None, ignore_index=-100, reduce=None, reduction='mean')
CLASStorch.nn.PoissonNLLLoss(log_input=True, full=False, size_average=None, eps=1e-08, reduce=None, reduction='mean')
CLASStorch.nn.PoissonNLLLoss(log_input=True, full=False, size_average=None, eps=1e-08, reduce=None, reduction='mean')
CLASStorch.nn.HingeEmbeddingLoss(margin=1.0, size_average=None, reduce=None, reduction='mean')

总结

  至此,基于PyTorch的损失函数已基本完成,常用的为前5种,可完成基本的分类和回归任务,其余的损失函数根据需求,可查找官方文档查看详细说明。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

PyTorch学习(5):损失函数 的相关文章

随机推荐