欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Pytorch - Cross Entropy Loss

程序员文章站 2022-05-27 09:44:39
...

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 的大小是 (minibatch,C)(minibatch,C,d1,d2,...,dK). K2 表示 K-dim 场景.

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

    loss(x,class)=log(exp(x[class])jexp(x[j]))

    loss(x,class)=x[class]+log(jexp(x[j]))

    weight形式:

    loss(x,class)=weight[class](x[class]+log(jexp(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=num_classes 类别总数.

    输入 - target y, (N), 每个值都是 0targets[i]C1

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

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

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

    输出 - 如果 reduce=True, 输出标量值. 如果 reduce=False, 输出与输入target一致, (N,d1,d2,...,dK), K2 适用于 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, ln=yn(logynxn)

    N - batchsize.

    如果 reduce=True,

    (x,y)=mean(L),if size_average=True

    (x,y)=sum(L),if size_average=False

  • 参数:

    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={l1,...,lN}T

    ln=wn[ynlogxn+(1yn)log(1xn)]

    N - batchsize

    如果 reduce=True,

    (x,y)=mean(L),if size_average=True

    (x,y)=sum(L),if size_average=False

    用于计算重构误差,如 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={l1,...,lN}T

    ln=wn[tnlogσ(xn)+(1tn)log(1σ(xn))]

    如果 reduce=True,

    (x,y)=mean(L),if size_average=True

    (x,y)=sum(L),if size_average=False

    用于计算重构误差,如 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 内的每个样本,

    loss(x,y)=iy[i]log(11+exp(x[i])+(1y[i])log(exp(x[i])1+exp(x[i]))

    其中, i=[0,nElement()], 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 内的每个样本,

    loss(x,y)=i,jmax(0,1(x[y[j]]x[i]))x.size(0)

    其中, i=[0,x.size(0)],j=[0,y.size(0)], 对于所有的 ijy[j]0iy[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)

相关标签: 交叉熵 Pytorch