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
       
       


文章目录

  • 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或者是一个标量。

公式:

  

criterion 再python中有什么作用 pytorch criterion函数_CrossEntropy


参数:

  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或者是一个标量。

公式:

  

criterion 再python中有什么作用 pytorch criterion函数_PyTorch_02


参数:

  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)。

公式:

  

criterion 再python中有什么作用 pytorch criterion函数_损失函数_03


  当weight参数被指定的时候,loss的计算公式变为:

  

criterion 再python中有什么作用 pytorch criterion函数_CrossEntropy_04


  计算出的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}。

公式:

  

criterion 再python中有什么作用 pytorch criterion函数_PyTorch_05


   注: σ() 表示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)、噪声不敏感,具有较强的鲁棒性。

公式:

  

criterion 再python中有什么作用 pytorch criterion函数_CrossEntropy_06


  理解为,当误差绝对值小于δ,采用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种,可完成基本的分类和回归任务,其余的损失函数根据需求,可查找官方文档查看详细说明。