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

PyTorch中torch.nn.functional的nll_loss()函数用于神经网络训练

发布时间:2023-12-16 21:58:39

PyTorch中torch.nn.functional模块的nll_loss()函数用于计算负对数似然损失(negative log likelihood loss)。它通常用于多分类问题中,特别是在对类别进行独热编码(one-hot encoding)的情况下。

该函数的输入是一个对数概率向量和一个真实标签向量,输出是模型预测标签与真实标签之间的损失。这个函数假设输入向量的每个元素表示对应类别的对数概率。

以下是一个示例,展示如何使用nll_loss()函数在PyTorch中进行神经网络训练。

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

# 定义神经网络模型
class Net(nn.Module):
    def __init__(self):
        super(Net, self).__init__()
        self.fc1 = nn.Linear(10, 20)
        self.fc2 = nn.Linear(20, 2)

    def forward(self, x):
        x = F.relu(self.fc1(x))
        x = self.fc2(x)
        return F.log_softmax(x, dim=1)

# 创建网络实例
model = Net()

# 定义损失函数和优化器
criterion = nn.NLLLoss()
optimizer = optim.Adam(model.parameters(), lr=0.01)

# 虚拟数据
input_data = torch.randn(2, 10)
target = torch.tensor([0, 1])

# 训练网络
optimizer.zero_grad()  # 清除梯度

output = model(input_data)  # 正向传播
loss = criterion(output, target)  # 计算损失
loss.backward()  # 反向传播
optimizer.step()  # 更新参数

# 打印损失
print(loss.item())

在上面的代码中,我们首先定义了一个简单的两层全连接神经网络模型Net。然后我们创建了模型实例model

接着,我们定义了损失函数nn.NLLLoss(),这将用于计算模型预测标签与真实标签之间的负对数似然损失。我们还定义了优化器optim.Adam(),用于更新模型参数。

接下来,我们创建了虚拟的输入数据input_data和对应的真实标签target。这里input_data是一个形状为(2, 10)的张量,代表了两个样本的特征。target是一个形状为(2,)的张量,代表了两个样本的真实标签。

然后,我们执行以下步骤来训练网络:

- 将优化器的梯度置零optimizer.zero_grad(),以便在每个训练步骤之间清除之前计算的梯度。

- 使用模型对输入数据进行正向传播output = model(input_data),得到模型的预测结果。

- 计算模型预测标签与真实标签之间的负对数似然损失loss = criterion(output, target)

- 对损失进行反向传播loss.backward(),以计算梯度。

- 使用优化器更新模型参数optimizer.step()

最后,我们打印出损失的值loss.item(),以便查看训练过程中的损失变化。

这就是使用torch.nn.functional中的nll_loss()函数进行神经网络训练的一个例子。希望能对你有所帮助!