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 必须是大小为 (对于未批处理的输入)、 或 大小的张量,其中 用于 K 维情况。最后一种情况对于更高维度的输入很有用,例如计算 2D 图像的每像素交叉熵损失。
此标准期望的 target 应该包含以下内容之一
范围 中的类索引,其中 是类别的数量;如果指定了 ignore_index,则此损失也接受此类索引(此索引可能不一定在类别范围内)。对于这种情况,未缩减(即,
reduction
设置为'none'
)的损失可以描述为其中 是输入, 是目标, 是权重, 是类别的数量,并且 跨越 minibatch 维度以及 用于 K 维情况。如果
reduction
不是'none'
(默认'mean'
),则请注意,这种情况等同于对输入应用
LogSoftmax
,然后应用NLLLoss
。每个类别的概率;当每个小批量项需要多个类别标签时非常有用,例如用于混合标签、标签平滑等。对于这种情况,未缩减的(即
reduction
设置为'none'
)损失可以描述为其中 是输入, 是目标, 是权重, 是类别的数量,并且 跨越 minibatch 维度以及 用于 K 维情况。如果
reduction
不是'none'
(默认'mean'
),则
注意
当 target 包含类别索引时,此标准的性能通常更好,因为这样可以进行优化计算。 仅当每个小批量项的单个类别标签过于限制时,才考虑将 target 作为类别概率提供。
- 参数
weight (Tensor,可选) – 赋予每个类别的手动重缩放权重。如果给定,则必须是大小为 C 和浮点 dtype 的 Tensor
size_average (bool,可选) – 已弃用(请参阅
reduction
)。默认情况下,损失在批次中的每个损失元素上取平均值。 请注意,对于某些损失,每个样本有多个元素。 如果字段size_average
设置为False
,则损失将改为针对每个小批量求和。 当reduce
为False
时忽略。 默认值:True
ignore_index (int,可选) – 指定一个要忽略的目标值,该值不影响输入梯度。 当
size_average
为True
时,损失会在非忽略目标上取平均值。 请注意,ignore_index
仅在目标包含类别索引时适用。reduce (bool,可选) – 已弃用(请参阅
reduction
)。 默认情况下,损失根据size_average
在每个小批量的观测值上取平均值或求和。 当reduce
为False
时,则改为返回每个批次元素的损失,并忽略size_average
。 默认值:True
reduction (str,可选) – 指定应用于输出的缩减方式:
'none'
|'mean'
|'sum'
。'none'
:不应用缩减;'mean'
:取输出的加权平均值;'sum'
:将对输出求和。 注意:size_average
和reduce
正在被弃用,同时,指定这两个参数中的任何一个都将覆盖reduction
。 默认值:'mean'
label_smoothing (float,可选) – [0.0, 1.0] 中的浮点数。 指定计算损失时的平滑量,其中 0.0 表示不平滑。 目标变为原始真实值和均匀分布的混合,如 Rethinking the Inception Architecture for Computer Vision 中所述。 默认值:。
- 形状
输入:形状 , 或 ,对于 K 维损失,其中 。
目标:如果包含类别索引,则形状为 , 或 ,对于 K 维损失,其中每个值应介于 之间。 如果包含类别概率,则形状与输入相同,并且每个值应介于 之间。
输出:如果 reduction 为 ‘none’,形状为 、 或 ,其中 在 K 维损失的情况下,取决于输入的形状。否则,为标量。
其中
示例
>>> # 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()