Pytorch - Cross Entropy Loss

Pytorch - Cross Entropy Loss

Pytorch 提供的交叉熵相关的函数有:

  • torch.nn.CrossEntropyLoss

  • torch.nn.KLDivLoss

  • torch.nn.BCELoss

  • torch.nn.BCEWithLogitsLoss

  • torch.nn.MultiLabelSoftMarginLoss

1. CrossEntropyLoss

class torch.nn.CrossEntropyLoss(weight=None, size_average=True, ignore_index=-100, reduce=True)[source]
  • 作用

    针对单目标分类问题, 结合了 nn.LogSoftmax()nn.NLLLoss() 来计算 loss.

    用于训练 C C 类别classes 的分类问题.

    参数 weight 是 1D Tensor, 分别对应每个类别class 的权重. 对于类别不平衡的训练数据集比较有用.

    输入input 包含了每一类别的概率或score.

    输入 input Tensor 的大小是 (minibatch,C) ( m i n i b a t c h , C ) (minibatch,C,d1,d2,...,dK) ( m i n i b a t c h , C , d 1 , d 2 , . . . , d K ) . K2 K ≥ 2 表示 K K -dim 场景.

    输入 target 是类别class 的索引( [0,C1] [ 0 , C − 1 ] , C C 是类别classes 总数.)

    loss(x,class)=log(exp(x[class])jexp(x[j])) l o s s ( x , c l a s s ) = − l o g ( e x p ( x [ c l a s s ] ) ∑ j e x p ( x [ j ] ) )

    loss(x,class)=x[class]+log(jexp(x[j])) l o s s ( x , c l a s s ) = − x [ c l a s s ] + l o g ( ∑ j e x p ( x [ j ] ) )

    weight形式:

    loss(x,class)=weight[class](x[class]+log(jexp(x[j]))) 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 ] + l o g ( ∑ j e x p ( x [ j ] ) ) )

    losses 在 minibatch 内求平均.

    也支持高维输入 inputs, 如 2D images, 则会逐元素计算 NLL Loss.

  • 参数:

    weight(Tensor, optional) - 每个类别class 的权重. 默认为值为 1 的 Tensor.

    size_average(bool, optional) – 默认为 True.

    ​ size_average=True, 则 losses 在 minibatch 结合 weight 求平均average.

    ​ size_average=False, 则losses 在 minibatch 求相加和sum.

    ​ 当 reduce=False 时,忽略该参数.

    ignore_index(int, optional) - 指定忽略的 target 值, 不影响 input 梯度计算.

    ​ 当 size_average=True, 对所有非忽略的 targets 求平均.

    reduce(bool, optional) - 默认为 True.

    ​ reduce=True, 则 losses 在 minibatch 求平均或相加和.

    ​ reduce=False, 则 losses 返回 per batch 值, 并忽略 size_average.

    输入 - input x, (N,C) ( N , C ) , C=num_classes C = n u m _ c l a s s e s 类别总数.

    输入 - target y, (N) ( N ) , 每个值都是 0targets[i]C1 0 ≤ t a r g e t s [ i ] ≤ C − 1

    输出 - 如果 reduce=True, 输出标量值. 如果 reduce=False, 输出与输入target一致, (N) ( N )

    输入 - input x, (N,C,d1,d2,...,dK) ( N , C , d 1 , d 2 , . . . , d K ) , K2 K ≥ 2 适用于 K K -dim 场景

    输入 - target y, (N,d1,d2,...,dK) ( N , d 1 , d 2 , . . . , d K ) , K2 K ≥ 2 适用于 K K -dim 场景

    输出 - 如果 reduce=True, 输出标量值. 如果 reduce=False, 输出与输入target一致, (N,d1,d2,...,dK) ( N , d 1 , d 2 , . . . , d K ) , K2 K ≥ 2 适用于 K K -dim 场景

  • 例示:

    
    # 1D
    
    import torch 
    import torch.nn as nn
    
    loss = nn.CrossEntropyLoss()
    
    # input, NxC=2x3
    
    input = torch.randn(2, 3, requires_grad=True)
    
    # target, N
    
    target = torch.empty(2, dtype=torch.long).random_(3)
    output = loss(input, target)
    output.backward()

2. KLDivLoss

class torch.nn.KLDivLoss(size_average=True, reduce=True)
  • 作用:

    相对熵, 也叫 KL 散度, Kullback-Leibler divergence Loss.

    KL 散度用于估计连续分布的距离.

    当对连续输出分布进行直接回归时, KL 散度比较有用.

    输入 input 应该是在进行了一次 forward 来计算每个类别class 的 log-probabilities 概率.

    输入 input 不一定是 2D Tensor, 因为其计算是逐元素进行的.

    (x,y)=L={l1,...,lN}T ℓ ( x , y ) = L = { l 1 , . . . , l N } T , ln=yn(logynxn) l n = y n ⊙ ( l o g y n − x n )

    N N - batchsize.

    如果 reduce=True,

    (x,y)=mean(L),if size_average=True ℓ ( x , y ) = m e a n ( L ) , i f   s i z e _ a v e r a g e = T r u e

    (x,y)=sum(L),if size_average=False ℓ ( x , y ) = s u m ( L ) , i f   s i z e _ a v e r a g e = F a l s e

  • 参数:

    size_average(bool, optional) – 默认为 True.

    ​ size_average=True, 则 losses 在 minibatch 求平均average.

    ​ size_average=False, 则losses 在 minibatch 求相加和sum.

    ​ 当 reduce=False 时,忽略该参数.

    reduce(bool, optional) - 默认为 True.

    ​ reduce=True, 则 losses 在 minibatch 求平均或相加和.

    ​ reduce=False, 则 losses 返回每个 input/target 元素, 并忽略 size_average.

    输入 - input x, (N,) ( N , ∗ ) ​

    输入 - target y, (N,) ( N , ∗ ) ​

    输出 - 如果 reduce=True, 输出标量值. 如果 reduce=False, 输出与输入一致, (N,) ( N , ∗ )

3. BCELoss

class torch.nn.BCELoss(weight=None, size_average=True, reduce=True)
  • 作用:

    计算 target 和 output 间的二值交叉熵(Binary Cross Entropy)

    (x,y)=L={l1,...,lN}T ℓ ( x , y ) = L = { l 1 , . . . , l N } T

    ln=wn[ynlogxn+(1yn)log(1xn)] l n = − w n [ y n ⋅ l o g x n + ( 1 − y n ) ⋅ l o g ( 1 − x n ) ]

    N N - batchsize

    如果 reduce=True,

    (x,y)=mean(L),if size_average=True ℓ ( x , y ) = m e a n ( L ) , i f   s i z e _ a v e r a g e = T r u e

    (x,y)=sum(L),if size_average=False ℓ ( x , y ) = s u m ( L ) , i f   s i z e _ a v e r a g e = F a l s e

    用于计算重构误差,如 auto-encoder 中.

    targets y 的值是 0 和 1 之间的数值.

  • 参数:

    weight(Tensor, optional) - 每个batch 元素 的权重.

    size_average(bool, optional) – 默认为 True.

    ​ size_average=True, 则 losses 在 minibatch 结合 weight 求平均average.

    ​ size_average=False, 则losses 在 minibatch 求相加和sum.

    ​ 当 reduce=False 时,忽略该参数.

    reduce(bool, optional) - 默认为 True.

    ​ reduce=True, 则 losses 在 minibatch 求平均或相加和.

    ​ reduce=False, 则 losses 返回 per input/target 元素值, 并忽略 size_average.

    输入 - input x, (N, *)

    输入 - target y, (N, *)​

    输出 - 如果 reduce=True, 输出标量值. 如果 reduce=False, 输出与输入一致, (N,) ( N , ∗ )

  • 例示:

    import torch 
    import torch.nn as nn
    
    sig = nn.Sigmoid()
    loss = nn.BCELoss()
    input = torch.randn(3, requires_grad=True)
    target = torch.empty(3).random_(2)
    output = loss(sig(input), target)
    output.backward()

4. BCEWithLogitsLoss

class torch.nn.BCEWithLogitsLoss(weight=None, size_average=True, reduce=True)
  • 作用:

    该 loss 层包括了 Sigmoid 层和 BCELoss 层. 单类别任务.

    数值计算稳定性更好( log-sum-exp trick), 相比与 Sigmoid + BCELoss.

    (x,y)=L={l1,...,lN}T ℓ ( x , y ) = L = { l 1 , . . . , l N } T

    ln=wn[tnlogσ(xn)+(1tn)log(1σ(xn))] l n = − w n [ t n ⋅ l o g σ ( x n ) + ( 1 − t n ) ⋅ l o g ( 1 − σ ( x n ) ) ]

    如果 reduce=True,

    (x,y)=mean(L),if size_average=True ℓ ( x , y ) = m e a n ( L ) , i f   s i z e _ a v e r a g e = T r u e

    (x,y)=sum(L),if size_average=False ℓ ( x , y ) = s u m ( L ) , i f   s i z e _ a v e r a g e = F a l s e

    用于计算重构误差,如 auto-encoder 中.

    targets t[i] t [ i ] 的值是 0 和 1 之间的数值.

  • 参数:

    weight(Tensor, optional) - 每个batch 元素 的权重.

    size_average(bool, optional) – 默认为 True.

    ​ size_average=True, 则 losses 在 minibatch 结合 weight 求平均average.

    ​ size_average=False, 则losses 在 minibatch 求相加和sum.

    ​ 当 reduce=False 时,忽略该参数.

    reduce(bool, optional) - 默认为 True.

    ​ reduce=True, 则 losses 在 minibatch 求平均或相加和.

    ​ reduce=False, 则 losses 返回 per input/target 元素值, 并忽略 size_average.

5. MultiLabelSoftMarginLoss

class torch.nn.MultiLabelSoftMarginLoss(weight=None, size_average=True, reduce=True)
  • 作用:

    基于 max-entropy 计算输入 input x 和 target x 间的 multi-label one-versus-all loss.

    对于 minibatch 内的每个样本,

    loss(x,y)=iy[i]log(11+exp(x[i])+(1y[i])log(exp(x[i])1+exp(x[i])) l o s s ( x , y ) = − ∑ i y [ i ] ∗ l o g ( 1 1 + e x p ( − x [ i ] ) + ( 1 − y [ i ] ) ∗ l o g ( e x p ( − x [ i ] ) 1 + e x p ( − x [ i ] ) )

    其中, i=[0,nElement()] i = [ 0 , n E l e m e n t ( ) ] , y[i]{0,1} y [ i ] ∈ { 0 , 1 }

  • 参数:

    weight(Tensor, optional) - 每个类别class 的权重. 默认为值为 1 的 Tensor.

    size_average(bool, optional) – 默认为 True.

    ​ size_average=True, 则 losses 在 minibatch 结合 weight 求平均average.

    ​ size_average=False, 则losses 在 minibatch 求相加和sum.

    ​ 当 reduce=False 时,忽略该参数.

    reduce(bool, optional) - 默认为 True.

    ​ reduce=True, 则 losses 在 minibatch 求平均或相加和.

    ​ reduce=False, 则 losses 返回 per batch 元素值, 并忽略 size_average.

    ​输入 - input x, (N, C), C = num_classes 类别总数.

    输入 - target y, (N)

    输出 - 如果 reduce=True, 输出标量值. 如果 reduce=False, 输出与输入target一致, (N) ( N )

6. MultiLabelMarginLoss

class torch.nn.MultiLabelMarginLoss(size_average=True, reduce=True)
  • 作用:

    计算 input x 和output y 间的 multi-class multi-classifitcation hinge loss.

    input x - 2D minibatch Tensor

    output y - target 类别class 索引的 2D Tensor.

    对于 minibatch 内的每个样本,

    loss(x,y)=i,jmax(0,1(x[y[j]]x[i]))x.size(0) l o s s ( x , y ) = ∑ i , j m a x ( 0 , 1 − ( x [ y [ j ] ] − x [ i ] ) ) x . s i z e ( 0 )

    其中, i=[0,x.size(0)],j=[0,y.size(0)] i = [ 0 , x . s i z e ( 0 ) ] , j = [ 0 , y . s i z e ( 0 ) ] , 对于所有的 i i j j y[j]0 y [ j ] ≥ 0 iy[j] i ≠ y [ j ] .


    该loss 只考虑从正面开始的非负 targets 的连续块.(The criterion only considers a contiguous block of non-negative targets that starts at the front.)

  • 参数:

    size_average(bool, optional) – 默认为 True.

    ​ size_average=True, 则 losses 在 minibatch 结合 weight 求平均average.

    ​ size_average=False, 则losses 在 minibatch 求相加和sum.

    ​ 当 reduce=False 时,忽略该参数.

    reduce(bool, optional) - 默认为 True.

    ​ reduce=True, 则 losses 在 minibatch 求平均或相加和.

    ​ reduce=False, 则 losses 返回 per batch 元素值, 并忽略 size_average.

    ​输入 - input x, (C) 或 (N, C), C = num_classes 类别总数, N 为 batchsize

    ​输入 - target y, C 或 (N, C)

    输出 - 如果 reduce=True, 输出标量值. 如果 reduce=False, 输出, (N) ( N )

你可能感兴趣的:(Pytorch,交叉熵,Pytorch)