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或者是一个标量。
公式:
参数:
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种,可完成基本的分类和回归任务,其余的损失函数根据需求,可查找官方文档查看详细说明。