F.nll_loss计算方式是下式,在函数内部不含有提前使用softmax转化的部分;
nn.CrossEntropyLoss内部先将输出使用softmax方式转化为概率的形式,后使用F.nll_loss函数计算交叉熵。
也就是:
CrossEntropyLoss()=log_softmax() + NLLLoss()
- 注意:
两个函数的输入分别是input和target,
input是网络预测的输出,形状为(batch_size, pro),其中pro为class的个数;
target是标签,不需要在进行转化为one_hot的形式,其形状为(batch_size,)。
代码:
output = torch.randn((2, 10))
target = torch.tensor([1, 2])
cross_loss = nn.CrossEntropyLoss()
loss_cross = cross_loss(output, target)
n_loss = F.nll_loss(F.log_softmax(output, dim=1), target)
print("loss_cross:", loss_cross)
print("nll_loss:", n_loss)
#output
loss_cross: tensor(2.4081)
nll_loss: tensor(2.4081)
源码:
class CrossEntropyLoss(_WeightedLoss):
__constants__ = ['ignore_index', 'reduction']
ignore_index: int
def __init__(self, weight: Optional[Tensor] = None, size_average=None, ignore_index: int = -100,
reduce=None, reduction: str = 'mean') -> None: