【8】pytorch中的损失函数
1.L1Loss
class torch.nn.L1Loss(size_average=None, reduce=None)
官方文档中仍有reduction='elementwise_mean’参数,但代码实现中已经删除该参数
功能: 计算output和target之差的绝对值,可选返回同维度的tensor或者是一个标量。
计算公式:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-G4DKJIry-1619105260819)(attachment:image.png)]
参数: reduce(bool)- 返回值是否为标量,默认为True
size_average(bool)- 当reduce=True时有效。为True时,返回的loss为平均值;为False时,返回的各样本的loss之和。
# 设置预测值
output = torch.tensor([[2,4],[6,8]]).float()
# tensor([[2., 4.],
# [6., 8.]])
# 设置标签值
target = torch.ones(2,2)
# tensor([[1., 1.],
# [1., 1.]])
# 设置三种不同参数的L1Loss
# reduce=False返回一个非标量,
reduceFalse_averageTrue = nn.L1Loss(size_average=True, reduce=False)
loss1 = reduceFalse_averageTrue(output,target)
# reduce=True返回一个标量,并求平均
reduceTrue_averageTrue = nn.L1Loss(size_average=True, reduce=True)
loss2 = reduceTrue_averageTrue(output,target)
# reduce=True返回一个标量,但不用求平均而是求和
reduceFalse_averageTrue = nn.L1Loss(size_average=False, reduce=True)
loss3 = reduceFalse_averageTrue(output,target)
loss1,loss2,loss3
# 输出
# loss1的值:输出一个数组而不是标量
# (tensor([[1., 3.],
# [5., 7.]]),
# loss2的值:输出一个标量而且求平均
# tensor(4.),
# loss3的值:输出一个标量求全部loss的和
# tensor(16.))
# 一般来说使用第二种,也是默认的那种
2.MSELoss
class torch.nn.MSELoss(size_average=None, reduce=None)
官方文档中仍有reduction='elementwise_mean’参数,但代码实现中已经删除该参数
功能: 计算output和target之差的平方,可选返回同维度的tensor或者是一个标量。
计算公式:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-stSh3QOF-1619105260823)(attachment:image.png)]
参数: reduce(bool)- 返回值是否为标量,默认为True
size_average(bool)- 当reduce=True时有效。为True时,返回的loss为平均值;为False时,返回的各样本的loss之和。
# 设置预测值
output = torch.tensor([[2,4],[6,8]]).float()
# tensor([[2., 4.],
# [6., 8.]])
# 设置标签值
target = torch.ones(2,2)
# tensor([[1., 1.],
# [1., 1.]])
# 设置三种不同参数的MSELoss
# reduce=False返回一个非标量,
reduceFalse_averageTrue = nn.MSELoss(size_average=True, reduce=False)
loss1 = reduceFalse_averageTrue(output,target)
# reduce=True返回一个标量,并求平均
reduceTrue_averageTrue = nn.MSELoss(size_average=True, reduce=True)
loss2 = reduceTrue_averageTrue(output,target)
# reduce=True返回一个标量,但不用求平均而是求和
reduceFalse_averageTrue = nn.MSELoss(size_average=False, reduce=True)
loss3 = reduceFalse_averageTrue(output,target)
loss1,loss2,loss3
# 输出
# loss1的值:输出一个数组而不是标量
# (tensor([[ 1., 9.],
# [25., 49.]]),
# loss2的值:输出一个标量而且求平均
# tensor(21.),
# loss3的值:输出一个标量求全部loss的和
# tensor(84.)
# 一般来说使用第二种,也是默认的那种
3.NLLoss
class torch.nn.NLLLoss(weight=None, size_average=None, ignore_index=-100, reduce=None,reduction=‘elementwise_mean’)
计算公式:loss(input, class) = -input[class]
功能: 不好用言语描述其功能!举个例,三分类任务,input=[-1.233, 2.657, 0.534], 真实标签为2(class=2),则loss为-0.534。就是对应类别上的输出,取一个负号!感觉被NLLLoss的名字欺骗了。
实际应用: 常用于多分类任务,但是input在输入NLLLoss()之前,需要对input进行log_softmax函数激活,即将input转换成概率分布的形式,并且取对数。其实这些步骤在CrossEntropyLoss中就有,如果不想让网络的最后一层是log_softmax层的话,就可以采用CrossEntropyLoss完全代替此函数。
即 CrossEntropyLoss = log_softmax + NLLLoss
参数:
weight(Tensor)- 为每个类别的loss设置权值,常用于类别不均衡问题。weight必须是float类型的tensor,其长度要于类别C一致,即每一个类别都要设置有weight。
size_average(bool)- 当reduce=True时有效。为True时,返回的loss为除以权重之和的平均值;为False时,返回的各样本的loss之和。
reduce(bool)- 返回值是否为标量,默认为True。
ignore_index(int)- 忽略某一类别,不计算其loss,其loss会为0,并且,在采用size_average时,不会计算那一类的loss,除的时候的分母也不会统计那一类的样本。