Pytorch - Cross Entropy Loss
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.
用于训练 类别classes 的分类问题.
参数
weight
是 1D Tensor, 分别对应每个类别class 的权重. 对于类别不平衡的训练数据集比较有用.输入
input
包含了每一类别的概率或score.输入 input Tensor 的大小是 或 . 表示 -dim 场景.
输入 target 是类别class 的索引(, 是类别classes 总数.)
带
weight
形式: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, , 类别总数.
输入 - target y, , 每个值都是
输出 - 如果 reduce=True, 输出标量值. 如果 reduce=False, 输出与输入target一致,
输入 - input x, , 适用于 -dim 场景
输入 - target y, , 适用于 -dim 场景
输出 - 如果 reduce=True, 输出标量值. 如果 reduce=False, 输出与输入target一致, , 适用于 -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, 因为其计算是逐元素进行的.
,
- batchsize.
如果
reduce=True
, -
参数:
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,
输入 - target y,
输出 - 如果 reduce=True, 输出标量值. 如果 reduce=False, 输出与输入一致,
3. BCELoss
class torch.nn.BCELoss(weight=None, size_average=True, reduce=True)
-
作用:
计算 target 和 output 间的二值交叉熵(Binary Cross Entropy)
- batchsize
如果
reduce=True
,用于计算重构误差,如 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, 输出与输入一致,
-
例示:
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.
如果
reduce=True
,用于计算重构误差,如 auto-encoder 中.
targets 的值是 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 内的每个样本,
其中, ,
-
参数:
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一致,
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 只考虑从正面开始的非负 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, 输出,