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

使用torch.nn.functional中的nll_loss()函数计算多类别分类的损失

发布时间:2023-12-16 22:01:06

在PyTorch中,可以使用torch.nn.functional中的nll_loss()函数来计算多类别分类的损失。nll_loss()函数计算的是负对数似然损失,适用于多类别分类问题。

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

首先,导入必要的库和模块:

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

接下来,创建一个包含四个样本和三个类别的虚拟数据集:

# 创建虚拟数据集
# 每个样本有三个特征
# 数据集大小为4
# 分为三个类别
# 标签为每个样本所属的类别
X = torch.Tensor([[1, 2, 3], [4, 5, 6], [7, 8, 9], [10, 11, 12]])
y = torch.LongTensor([0, 1, 1, 2])

接下来,创建一个包含三个类别的多类别分类模型:

# 创建多类别分类模型
# 输入特征数为三
# 输出类别数为三
class Classifier(nn.Module):
    def __init__(self):
        super(Classifier, self).__init__()
        self.fc = nn.Linear(3, 3)
    
    def forward(self, x):
        x = self.fc(x)
        return F.log_softmax(x, dim=1)

然后,定义模型、优化器和损失函数:

# 定义模型、优化器和损失函数
model = Classifier()
optimizer = torch.optim.SGD(model.parameters(), lr=0.01)
criterion = nn.NLLLoss()

接下来,进行模型的训练过程:

# 进行模型的训练
num_epochs = 100
for epoch in range(num_epochs):
    # 前向传播
    outputs = model(X)
    # 计算损失
    loss = criterion(outputs, y)
    # 反向传播和优化
    optimizer.zero_grad()
    loss.backward()
    optimizer.step()
    
    # 打印每个训练轮次的损失
    if (epoch+1) % 10 == 0:
        print('Epoch [{}/{}], Loss: {:.4f}'.format(epoch+1, num_epochs, loss.item()))

最后,使用训练好的模型进行预测:

# 使用训练好的模型进行预测
output = model(X)
_, predicted = torch.max(output.data, 1)
print('Predicted labels:', predicted)

这个例子展示了如何使用torch.nn.functional中的nll_loss()函数计算多类别分类的损失。首先,创建一个包含虚拟数据的数据集。然后创建一个多类别分类模型,并定义优化器和损失函数。接下来,进行模型的训练过程,并打印每个训练轮次的损失。最后,使用训练好的模型进行预测。