pytorch中的损失函数

云社区 博客 博客详情

【8】pytorch中的损失函数

knightaa 发表于 2021-04-24 22:52:20

15

0

0
【摘要】 1.L1Lossclass torch.nn.L1Loss(size_average=None, reduce=None)官方文档中仍有reduction='elementwise_mean’参数,但代码实现中已经删除该参数功能: 计算output和target之差的绝对值,可选返回同维度的tensor或者是一个标量。计算公式:[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接...

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,除的时候的分母也不会统计那一类的样本。

(完)