PyTorch中torch.nn.functional的nll_loss()函数用于神经网络训练
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()函数进行神经网络训练的一个例子。希望能对你有所帮助!
