快捷方式

CrossEntropyLoss

class torch.nn.CrossEntropyLoss(weight=None, size_average=None, ignore_index=-100, reduce=None, reduction='mean', label_smoothing=0.0)[source][source]

此标准计算输入 logits 和目标之间的交叉熵损失。

当训练具有 C 个类别的分类问题时,这很有用。如果提供,可选参数 weight 应该是一个 1D Tensor,为每个类别分配权重。当您有一个不平衡的训练集时,这尤其有用。

input 预计包含每个类别的未归一化 logits(通常 需要为正数或总和为 1)。input 必须是大小为 (C)(C)(对于未批处理的输入)、(minibatch,C)(minibatch, C)(minibatch,C,d1,d2,...,dK)(minibatch, C, d_1, d_2, ..., d_K) 大小的张量,其中 K1K \geq 1 用于 K 维情况。最后一种情况对于更高维度的输入很有用,例如计算 2D 图像的每像素交叉熵损失。

此标准期望的 target 应该包含以下内容之一

  • 范围 [0,C)[0, C) 中的类索引,其中 CC 是类别的数量;如果指定了 ignore_index,则此损失也接受此类索引(此索引可能不一定在类别范围内)。对于这种情况,未缩减(即,reduction 设置为 'none')的损失可以描述为

    (x,y)=L={l1,,lN},ln=wynlogexp(xn,yn)c=1Cexp(xn,c)1{ynignore_index}\ell(x, y) = L = \{l_1,\dots,l_N\}^\top, \quad l_n = - w_{y_n} \log \frac{\exp(x_{n,y_n})}{\sum_{c=1}^C \exp(x_{n,c})} \cdot \mathbb{1}\{y_n \not= \text{ignore\_index}\}

    其中 xx 是输入,yy 是目标,ww 是权重,CC 是类别的数量,并且 NN 跨越 minibatch 维度以及 d1,...,dkd_1, ..., d_k 用于 K 维情况。如果 reduction 不是 'none'(默认 'mean'),则

    (x,y)={n=1N1n=1Nwyn1{ynignore_index}ln,if reduction=‘mean’;n=1Nln,if reduction=‘sum’.\ell(x, y) = \begin{cases} \sum_{n=1}^N \frac{1}{\sum_{n=1}^N w_{y_n} \cdot \mathbb{1}\{y_n \not= \text{ignore\_index}\}} l_n, & \text{if reduction} = \text{`mean';}\\ \sum_{n=1}^N l_n, & \text{if reduction} = \text{`sum'.} \end{cases}

    请注意,这种情况等同于对输入应用 LogSoftmax,然后应用 NLLLoss

  • 每个类别的概率;当每个小批量项需要多个类别标签时非常有用,例如用于混合标签、标签平滑等。对于这种情况,未缩减的(即 reduction 设置为 'none')损失可以描述为

    (x,y)=L={l1,,lN},ln=c=1Cwclogexp(xn,c)i=1Cexp(xn,i)yn,c\ell(x, y) = L = \{l_1,\dots,l_N\}^\top, \quad l_n = - \sum_{c=1}^C w_c \log \frac{\exp(x_{n,c})}{\sum_{i=1}^C \exp(x_{n,i})} y_{n,c}

    其中 xx 是输入,yy 是目标,ww 是权重,CC 是类别的数量,并且 NN 跨越 minibatch 维度以及 d1,...,dkd_1, ..., d_k 用于 K 维情况。如果 reduction 不是 'none'(默认 'mean'),则

    (x,y)={n=1NlnN,if reduction=‘mean’;n=1Nln,if reduction=‘sum’.\ell(x, y) = \begin{cases} \frac{\sum_{n=1}^N l_n}{N}, & \text{if reduction} = \text{`mean';}\\ \sum_{n=1}^N l_n, & \text{if reduction} = \text{`sum'.} \end{cases}

注意

target 包含类别索引时,此标准的性能通常更好,因为这样可以进行优化计算。 仅当每个小批量项的单个类别标签过于限制时,才考虑将 target 作为类别概率提供。

参数
  • weight (Tensor可选) – 赋予每个类别的手动重缩放权重。如果给定,则必须是大小为 C 和浮点 dtype 的 Tensor

  • size_average (bool可选) – 已弃用(请参阅 reduction)。默认情况下,损失在批次中的每个损失元素上取平均值。 请注意,对于某些损失,每个样本有多个元素。 如果字段 size_average 设置为 False,则损失将改为针对每个小批量求和。 当 reduceFalse 时忽略。 默认值:True

  • ignore_index (int可选) – 指定一个要忽略的目标值,该值不影响输入梯度。 当 size_averageTrue 时,损失会在非忽略目标上取平均值。 请注意,ignore_index 仅在目标包含类别索引时适用。

  • reduce (bool可选) – 已弃用(请参阅 reduction)。 默认情况下,损失根据 size_average 在每个小批量的观测值上取平均值或求和。 当 reduceFalse 时,则改为返回每个批次元素的损失,并忽略 size_average。 默认值:True

  • reduction (str可选) – 指定应用于输出的缩减方式:'none' | 'mean' | 'sum''none':不应用缩减;'mean':取输出的加权平均值;'sum':将对输出求和。 注意:size_averagereduce 正在被弃用,同时,指定这两个参数中的任何一个都将覆盖 reduction。 默认值:'mean'

  • label_smoothing (float可选) – [0.0, 1.0] 中的浮点数。 指定计算损失时的平滑量,其中 0.0 表示不平滑。 目标变为原始真实值和均匀分布的混合,如 Rethinking the Inception Architecture for Computer Vision 中所述。 默认值:0.00.0

形状
  • 输入:形状 (C)(C)(N,C)(N, C)(N,C,d1,d2,...,dK)(N, C, d_1, d_2, ..., d_K),对于 K 维损失,其中 K1K \geq 1

  • 目标:如果包含类别索引,则形状为 ()()(N)(N)(N,d1,d2,...,dK)(N, d_1, d_2, ..., d_K),对于 K 维损失,其中每个值应介于 [0,C)[0, C) 之间。 如果包含类别概率,则形状与输入相同,并且每个值应介于 [0,1][0, 1] 之间。

  • 输出:如果 reduction 为 ‘none’,形状为 ()()(N)(N)(N,d1,d2,...,dK)(N, d_1, d_2, ..., d_K),其中 K1K \geq 1 在 K 维损失的情况下,取决于输入的形状。否则,为标量。

其中

C=类别数量N=批大小\begin{aligned} C ={} & \text{number of classes} \\ N ={} & \text{batch size} \\ \end{aligned}

示例

>>> # Example of target with class indices
>>> loss = nn.CrossEntropyLoss()
>>> input = torch.randn(3, 5, requires_grad=True)
>>> target = torch.empty(3, dtype=torch.long).random_(5)
>>> output = loss(input, target)
>>> output.backward()
>>>
>>> # Example of target with class probabilities
>>> input = torch.randn(3, 5, requires_grad=True)
>>> target = torch.randn(3, 5).softmax(dim=1)
>>> output = loss(input, target)
>>> output.backward()

文档

访问 PyTorch 的全面开发者文档

查看文档

教程

获取面向初学者和高级开发者的深入教程

查看教程

资源

查找开发资源并获得解答

查看资源