欢迎访问宙启技术站
智能推送

使用torch.nn.functional的nll_loss()函数计算交叉熵损失

发布时间:2023-12-16 21:55:40

torch.nn.functional的nll_loss()函数计算交叉熵损失。交叉熵损失通常用于多类别分类问题,其中输出是一个概率分布。该函数首先对输入进行对数变换,然后计算真实标签的负对数似然。最终,函数返回一个标量,表示平均损失。

下面是一个使用nll_loss()函数的例子:

import torch
import torch.nn.functional as F

# 生成一个随机的概率分布
input = torch.randn(3, 5, requires_grad=True)
# 概率分布对应的真实标签
target = torch.tensor([1, 0, 4])

# 使用nll_loss()计算交叉熵损失
loss = F.nll_loss(F.log_softmax(input, dim=1), target)

print(loss.item())

在上面的例子中,我们首先生成了一个随机的概率分布(input)(形状为3x5)。然后,我们定义了一个包含3个真实标签的tensor(target)。接下来,我们使用F.log_softmax函数对input进行对数变换,然后将其传递给nll_loss()函数。最终,我们打印出计算得到的交叉熵损失。

在实际应用中,我们通常会将交叉熵损失与模型的输出一起使用,以便在训练过程中计算损失和进行反向传播。下面是一个完整的例子,展示了如何使用nll_loss()计算交叉熵损失并进行反向传播:

import torch
import torch.nn as nn
import torch.optim as optim
import torch.nn.functional as F

# 定义一个简单的神经网络模型
class Net(nn.Module):
    def __init__(self):
        super(Net, self).__init__()
        self.fc1 = nn.Linear(10, 50)
        self.fc2 = nn.Linear(50, 2)
    
    def forward(self, x):
        x = F.relu(self.fc1(x))
        x = self.fc2(x)
        return x

# 创建模型和优化器
model = Net()
optimizer = optim.SGD(model.parameters(), lr=0.01)

# 生成一个随机的输入
input = torch.randn(32, 10)
# 随机生成的真实标签
target = torch.randint(0, 2, (32,))

# 前向传播
output = model(input)
# 使用nll_loss()计算交叉熵损失
loss = F.nll_loss(F.log_softmax(output, dim=1), target)

# 反向传播
optimizer.zero_grad()
loss.backward()
optimizer.step()

print(loss.item())

在上面的例子中,我们首先定义了一个简单的神经网络模型,包含一个全连接层。然后,我们创建了一个优化器(optimizer)和一个随机的输入(input)。接下来,我们执行前向传播,通过模型输出得到预测结果(output)。然后,我们使用nll_loss()函数计算交叉熵损失。之后,我们通过调用loss.backward()和optimizer.step()来执行反向传播和更新模型的参数。最后,我们打印出计算得到的交叉熵损失。

总结起来,torch.nn.functional的nll_loss()函数可以方便地计算交叉熵损失,用于评估模型输出与真实标签之间的差异。它适用于多类别分类问题,并在深度学习中广泛使用。