Pytorch - Cross Entropy Loss

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/oJiMoDeYe12345/article/details/80196376

Pytorch - Cross Entropy Loss

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

1. CrossEntropyLoss

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

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

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

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

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

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

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

    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 ] ) )

    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形式:

    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 ) , C = n u m _ c l a s s e s 类别总数.

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

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

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

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

    输出 - 如果 reduce=True, 输出标量值. 如果 reduce=False, 输出与输入target一致, ( N , d 1 , d 2 , . . . , d K ) , K 2 适用于 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 = { l 1 , . . . , l N } T , l n = y n ( l o g y n x n )

    N - batchsize.

    如果 reduce=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 ) = 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 , )

    输入 - target y, ( N , )

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

3. BCELoss

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

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

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

    l n = w n [ y n l o g x n + ( 1 y n ) l o g ( 1 x n ) ]

    N - batchsize

    如果 reduce=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 ) = 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 , )

  • 例示:

    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 = { l 1 , . . . , l N } T

    l n = w n [ t n l o g σ ( x n ) + ( 1 t n ) l o g ( 1 σ ( x n ) ) ]

    如果 reduce=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 ) = 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 ] 的值是 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 内的每个样本,

    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 , n E l e m e n t ( ) ] , 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 )

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 内的每个样本,

    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 . s i z e ( 0 ) ] , j = [ 0 , y . s i z e ( 0 ) ] , 对于所有的 i j y [ j ] 0 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 )

猜你喜欢

转载自blog.csdn.net/oJiMoDeYe12345/article/details/80196376
今日推荐