softmax_with_cross_entropy¶
- paddle.nn.functional. softmax_with_cross_entropy ( logits, label, soft_label=False, ignore_index=- 100, numeric_stable_mode=True, return_softmax=False, axis=- 1 ) [源代码] ¶
实现了 softmax 交叉熵损失函数。该函数会将 softmax 操作、交叉熵损失函数的计算过程进行合并,从而提供了数值上更稳定的梯度值。
因为该运算对 logits
的 axis
维执行 softmax 运算,所以它需要未缩放的 logits
。该运算不应该对 softmax 运算的输出进行操作,否则会产生错误的结果。
当 soft_label
为 False
时,label
除了 axis
维度上的形状为 1,其余维度和 logits
一致,表示一批数据中的每一个样本仅可分类到一个类别。
涉及到的等式如下:
硬标签(每个样本仅可分到一个类别)
软标签(每个样本以一定的概率被分配至多个类别中,概率和为 1)
如果
numeric_stable_mode
为True
,softmax 结果首先经由下式计算得出,然后使用 softmax 结果和label
计算交叉熵损失。
参数¶
logits (Tensor) - 维度为任意维的多维
Tensor
,数据类型为 float32 或 float64。表示未缩放的输入。label (Tensor) - 如果
soft_label
为 True,label
是一个和logits
维度相同的的Tensor
。如果soft_label
为 False,label
是一个在 axis 维度上大小为 1,其它维度上与logits
维度相同的Tensor
。soft_label (bool,可选) - 指明是否将输入标签当作软标签。默认值:False。
ignore_index (int,可选) - 指明要无视的目标值,使其不对输入梯度有贡献。仅在
soft_label
为 False 时有效,默认值:kIgnoreIndex(-100)。numeric_stable_mode (bool,可选) – 指明是否使用一个具有更佳数学稳定性的算法。仅在
soft_label
为 False 的 GPU 模式下生效。若soft_label
为 True 或者执行设备为 CPU,算法一直具有数学稳定性。注意使用稳定算法时速度可能会变慢。默认值:True。return_softmax (bool,可选) – 指明是否在返回交叉熵计算结果的同时返回 softmax 结果。默认值:False。
axis (int,可选) – 执行 softmax 计算的维度索引。其范围为 \([-1,rank-1]\),其中
rank
是输入logits
的秩。默认值:-1。
返回¶
如果
return_softmax
为 False,则返回交叉熵损失结果的Tensor
,数据类型和logits
一致,除了axis
维度上的形状为 1,其余维度和logits
一致。如果
return_softmax
为 True,则返回交叉熵损失结果的Tensor
和 softmax 结果的Tensor
组成的元组。其中交叉熵损失结果的数据类型和logits
一致,除了axis
维度上的形状为 1,其余维度上交叉熵损失结果和logits
一致;softmax 结果的数据类型和logits
一致,维度和logits
一致。
代码示例¶
import paddle
logits = paddle.to_tensor([0.4, 0.6, 0.9], dtype="float32")
label = paddle.to_tensor([1], dtype="int64")
out = paddle.nn.functional.softmax_with_cross_entropy(logits=logits, label=label)
print(out)
# Tensor(shape=[1], dtype=float32, place=Place(gpu:0), stop_gradient=True,
# [1.15328646])