torch.nn.functional的nll_loss()函数用于神经网络模型的训练优化
torch.nn.functional中的nll_loss()函数用于计算负对数似然损失(Negative Log Likelihood Loss),用于训练优化神经网络模型。负对数似然损失常用于多分类问题中,特别是在使用softmax函数作为输出层激活函数时。
该函数的输入是模型的预测值和目标值,输出是一个标量张量,表示模型的损失值。损失函数的计算公式如下:
loss(x, class) = -x[class],其中x表示模型的预测概率值,class表示实际的类别。
下面是一个使用nll_loss()函数的例子:
import torch import torch.nn.functional as F # 构造模型的预测值和目标值 logits = torch.tensor([[0.2, 0.5, 0.3], [0.1, 0.4, 0.5]]) # 模型的预测值,使用softmax函数后的结果 target = torch.tensor([0, 2]) # 目标值,实际的类别 # 使用nll_loss()函数计算损失值 loss = F.nll_loss(logits, target) print(loss.item())
这段代码中,首先构造了一个2x3的张量logits,表示模型的预测值。每一行表示一个样本的预测概率分布,三列分别表示三个类别的概率。然后构造了一个长度为2的张量target,表示两个样本的实际类别。
接下来,使用nll_loss()函数计算这两个样本的损失值。由于我们没有使用softmax函数,所以函数内部会自动将预测值进行归一化处理。损失值的计算如下:
个样本的损失值:-log(0.2) = 1.6094
第二个样本的损失值:-log(0.5) = 0.6931
因此,最终的损失值为1.6094 + 0.6931 = 2.3025。
需要注意的是,nll_loss()函数的目标值是类别的索引,表示实际的类别。对于多分类问题,一般使用CrossEntropyLoss()函数代替nll_loss()函数,因为CrossEntropyLoss()函数内部已经包含了softmax操作,可以直接对模型的预测值进行归一化。但在某些特殊情况下,如需要手动进行类别的归一化处理时,可以使用nll_loss()函数。
另外,nll_loss()函数还支持更多的参数,如忽略某些类别、使用权重进行加权等,具体使用方法可参考官方文档。
