Pytorch损失函数初始化调用与形参调用以及常用使用场景


pytorch API官方文档:

https://pytorch.org/docs/stable/_modules/torch/nn/modules/loss.html

可参考链接

https://www.jianshu.com/p/579a0f4cbf24


1、L1loss


torch.nn.L1Loss

功能

计算输入 X和目标 Y中的每个元素之间的 平均绝对误差 (MAE)。

可选返回同维度的tensor或者是一个标量。

计算公式
如果reduction == “none”
L ( x , y ) = l 1 , l 2 , ⋅ ⋅ ⋅ , l n T , l n = ∣ x n − y n ∣ L(x, y) = {l_1, l_2, ···, l_n}^T, l_n = |x_n - y_n| L(x,y)=l1,l2,lnTln=xnyn

如果reduction != “none”在这里插入图片描述
其中,
input x n x_n xn 和 target y n y_n yn 是任意形状的张量,每个张量都有 n n n 维大小。
n为batch_size。

类初始化参数

size_average(bool)

  1. 当reduce=True时有效。
  2. 为True时,返回的loss为平均值,即 mean(L)
  3. 为False时,返回的各样本的loss之和,即 sum(L)

reduce(bool)

  1. 返回值是否为标量,默认为True

reduction(string)(Default: ‘mean’)

  1. 'none':不进行操作
  2. 'mean':输出的总和除以输出元素的数量
  3. 'sum':对输出进行求和
  4. 注意:size_average和reduce正在被弃用的过程中,同时,指定这两个参数中的任何一个都将覆盖reduce。
    使用场景

使用场景

它是第二个最常用的回归损失函数。
它测量一组预测中误差的平均大小,而不考虑它们的方向。
与MSE损失函数相比,MAE损失函数对异常值具有更强的鲁棒性。
因此,如果 数据有很多异常值,可以考虑使用它
使用L1Loss进行 多分类


2、MSELoss


torch.nn.MSELoss


功能

计算输入 X和目标 Y中的每个元素之间的 平均平方误差 (MSE,L2范数的平方)
可选返回同维度的tensor或者是一个标量。

计算公式
如果reduction == “none”
L ( x , y ) = l 1 , l 2 , ⋅ ⋅ ⋅ , l n T , l n = ( x n − y n ) 2 L(x, y) = {l_1, l_2, ···, l_n}^T, l_n = (x_n - y_n)^2 L(x,y)=l1,l2,lnTln=(xnyn)2在这里插入图片描述
如果reduction != “none”在这里插入图片描述
其中,
θ是模型中待训练的参数。
input x n x_n xn 和 target y n y_n yn 是任意形状的张量,每个张量都有 n n n 维大小。
n为batch_size。

类初始化参数

size_average(bool)

  1. 当reduce=True时有效。
  2. 为True时,返回的loss为平均值,即 mean(L)
  3. 为False时,返回的各样本的loss之和,即 sum(L)

reduce(bool)

  1. 返回值是否为标量,默认为True

reduction(string)(Default: ‘mean’)

  1. 'none':不进行操作
  2. 'mean':输出的总和除以输出元素的数量
  3. 'sum':对输出进行求和
  4. 注意:size_average和reduce正在被弃用的过程中,同时,指定这两个参数中的任何一个都将覆盖reduce。

使用场景

  1. MSE的意义相当明确:如果预测值与真实值的 欧式距离 越大,损失函数越大。欧式距离越小,损失函数越小。同时,求导也是相当容易:
  2. MSE损失函数通过平方化误差来惩罚模型的误差,这种性质使得MSE代价函数对异常值的鲁棒性降低。因此,如果数据容易出现许多异常值,则不应使用它
  3. 注: Sigmoid一般不与MSE配合使用。在深度学习里,Sigmoid函数是常见的激活函数。特别注意的是,当使用Sigmoid做激活函数的时候,损失函数不能选择MSE。
    因为Sigmoid的导数为f(x)(1−f(x))。假设当预测值为f(x)=1而真实值为0的时候,此时虽然(yi−y˜)很大,但是f(x)(1−f(x))太小接近0,收敛速度同样很慢。

3、CrossEntropyLoss


torch.nn.CrossEntropyLoss


公式详解的参考链接:

https://www.cnblogs.com/marsggbo/p/10401215.html
https://zhuanlan.zhihu.com/p/98785902


功能

交叉熵损失
input经过softmax激活函数之后,再计算其与target的交叉熵损失。
该函数将 nn.LogSoftmax() 和 nn.NLLLoss() 的结合
先经过nn.LogSoftmax()转化为归一化的概率分布,然后再通过nn.NLLLoss()函数
主要是用来判定实际的输出与期望的输出的接近程度

计算公式
1、
l o s s ( x , c l a s s ) = − log ⁡ ( exp ⁡ ( x [ c l a s s ] ) ∑ j exp ⁡ ( x [ j ] ) ) = − x [ c l a s s ] + log ⁡ ( ∑ j exp ⁡ ( x [ j ] ) ) loss(x, class) = -\log \left (\frac{ \exp( x[class] ) }{ \sum_j \exp( x[j] ) } \right) = -x[class] + \log \left ( \sum_j \exp( x[j] ) \right) loss(x,class)=log(jexp(x[j])exp(x[class]))=x[class]+log(jexp(x[j]))

x是1维,长为Ctensor
class是1个整数

2、如果传入指定的weight参数,则公式如下所示:
l o s s ( x , c l a s s ) = w e i g h t [ c l a s s ] ( − x [ c l a s s ] + log ⁡ ( ∑ j ( exp ⁡ ( x [ j ] ) ) ) ) loss(x, class) = weight[class] \left (-x[class] + \log\left ( \sum_j ( \exp( x[j] ) )\right)\right) loss(x,class)=weight[class](x[class]+log(j(exp(x[j]))))

weight是1维,长为Ctensor

如果使用该API,则输入时可选参数 weight应为一维Tensor,且Tensor中的每个元素代表每个类权重。
被期望的输入是包含每个类的原始、非标准化的分数。
x(预测输入): [ N , C ] [N, C] [N,C],或者 [ N , C , d 1 , d 2 , ⋅ ⋅ ⋅ , d k ] , k ≥ 1 [N, C,d_1, d_2, ···, d_k], k\geq1 [N,Cd1,d2,,dk],k1,计算k维损失
y(目标输入): [ N ] [N] [N],或者 [ N , d 1 , d 2 , ⋅ ⋅ ⋅ , d k ] , k ≥ 1 [N, d_1, d_2, ···, d_k], k\geq1 [N,d1,d2,,dk],k1,计算k维损失
output(输出):score,

3、对每一个小批的观测值计算损失的平均值。如果权重参数被指定,那么这是一个加权平均值:
l o s s = ∑ i = 1 N l o s s ( i , c l a s s [ i ] ) ∑ i = 1 N w e i g h t [ c l a s s [ i ] ] loss = \frac{\sum_{i = 1}^N loss(i, class[i])} { \sum_{i = 1}^N weight[class[i]] } loss=i=1Nweight[class[i]]i=1Nloss(i,class[i])

  • CrossEntropyLoss()对象 形参调用
    • x是2维,形为[N, C]tensor
    • class是1维,形为[N]tensor
    • weight是1维,形为[C]tensor

类初始化参数

weight(Tensor)

  1. 为每个类别的loss设置权值,常用于类别不均衡问题。
    weight必须是float类型的tensor,其长度要于类别数C一致,
    即每一个类别都要设置有weight。

ignore_index (int)

  1. 指定一个目标值,忽略某一类别,不计算其loss,其loss会为0。
    并且,当 size_averageTrue 时,不会计算那一类的loss,
    而且,除的时候的分母也不会统计那一类的样本。
    即,损失是在非忽略目标上平均的

size_average(bool)不推荐使用 (见reduction)

  1. reduce=True 时有效。
  2. True:损失是批次中每个损失元素的平均数。
    请注意,对于某些损失,每个样本有多个元素。
  3. False:将每个小批量的损失相加。

reduce(bool)不推荐使用 (见reduction)

  1. 返回值是否为标量,默认为True
  2. True: 根据size_average,对每个小批量的观察结果求平均值或求和
  3. False:返回每批元素损失,并忽略size_average

reduction(string)(Default: ‘mean’)

  1. 'none':不进行操作
  2. 'mean':采用输出的加权平均值
  3. 'sum':对输出进行求和

使用场景

在训练类别数目为:C时的的分类问题时很有用。
当您的训练集不平衡时,这特别有用。这时候需要使用参数weight(Tensor)

4、NLLLoss


torch.nn.NLLLoss


功能

负对数似然损失(negative log likelihood loss)
把输入的对数概率向量与Label对应的那个值拿出来,求负数后,再求均值。

计算公式
1、如果reduction==“None”,那么
l ( x , y ) = L = { l 1 , l 2 , ⋅ ⋅ ⋅ , l n } T , l n = − w y n x n , y n l(x, y) = L = \{ l_1, l_2, ···, l_n\}^T, l_n = -w_{y_n} x_{n, y_n} l(x,y)=L={ l1,l2,,ln}Tln=wynxn,yn
w c = w e i g h t [ c ] ∗ 1 { c ≠ i g n o r e i n d e x } , x n , y n = x

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值