首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何在PyTorch中绘制混淆矩阵?

如何在PyTorch中绘制混淆矩阵?
EN

Stack Overflow用户
提问于 2022-10-10 20:11:02
回答 1查看 133关注 0票数 1

我是PyTorch和一般机器学习的初学者。我有一个训练和测试MLP分类MNIST数据集的代码。我需要绘制一个混淆矩阵,但不幸的是,我不知道怎么做。我正在为这个提供代码。请让我知道我应该为混淆矩阵写什么代码。顺便说一句,这不是我的密码,我是从网上得到的。提前谢谢。

以下是代码:

代码语言:javascript
运行
复制
import torch
from torch import nn
import torch.nn.functional as F
from torchvision import datasets, transforms
import time

# enable GPU
if torch.cuda.is_available():
    device = torch.device('cuda')
else:
    device = torch.device('cpu')
    
print('Using PyTorch version:', torch.__version__, ' Device:', device)

# Build a simple MLP to train on MNIST
model = nn.Sequential(
    nn.Linear(784, 128),
    nn.ReLU(),
    nn.Linear(128, 256),
    nn.ReLU(),
    nn.Linear(256, 512),
    nn.ReLU(),
    nn.Linear(512, 10),
    nn.LogSoftmax(dim=1)
)

# Load the training data
train_loader = torch.utils.data.DataLoader(
    datasets.MNIST('data', train=True, download=True,
                     transform=transforms.Compose([
                            transforms.ToTensor(),
                            transforms.Normalize((0.5,), (0.5,))
                        ])),
    batch_size=64, shuffle=True)    

# Load the test data
test_loader = torch.utils.data.DataLoader(
    datasets.MNIST('data', train=False, transform=transforms.Compose([
                            transforms.ToTensor(),
                            transforms.Normalize((0.5,), (0.5,))
                        ])),
    batch_size=64, shuffle=True)


# Define the optimizer
optimizer = torch.optim.SGD(model.parameters(), lr=0.01)

# Define the loss function
criterion = nn.NLLLoss()

# Train the model
def train(epoch):
    model.train()
    for batch_idx, (data, target) in enumerate(train_loader):
        data = data.view(-1, 784)
        optimizer.zero_grad()
        output = model(data)
        loss = criterion(output, target)
        loss.backward()
        optimizer.step()
        if batch_idx % 100 == 0:
            print('Train Epoch: {} [{}/{} ({:.0f}%)]\tLoss: {:.6f}'.format(
                epoch, batch_idx * len(data), len(train_loader.dataset),
                100. * batch_idx / len(train_loader), loss.item()))

# Test the model
def test():
    model.eval()
    test_loss = 0
    correct = 0
    with torch.no_grad():
        for data, target in test_loader:
            data = data.view(-1, 784)
            output = model(data)
            test_loss += criterion(output, target).item()
            pred = output.data.max(1, keepdim=True)[1]
            correct += pred.eq(target.data.view_as(pred)).sum()

    test_loss /= len(test_loader.dataset)
    print('Test set: Average loss: {:.4f}, Accuracy: {}/{} ({:.0f}%) '.format(
        test_loss, correct, len(test_loader.dataset),
        100. * correct / len(test_loader.dataset)))

start = time.time()

# main
if __name__ == '__main__': 

    # Run the training loop
    # This is the loop you have to time
    for epoch in range(1, 10):
        train(epoch)

        
end = time.time()
print(end - start)

test() 
   
# Save the model
torch.save(model.state_dict(), "mnist_mlp.pt")
EN

回答 1

Stack Overflow用户

发布于 2022-10-10 20:52:04

我建议您使用sklearn包。

代码语言:javascript
运行
复制
from sklearn.metrics import confusion_matrix, ConfusionMatrixDisplay


cm = confusion_matrix(y_test, predictions)
ConfusionMatrixDisplay(cm).plot()

输出将如下所示

这是一些额外的文件

编辑:

y_test将是测试集的正确标签,而predictions将是您模型中的预测标签。

将答案稍加修改以适应您的代码:

在这一行

代码语言:javascript
运行
复制
for data, target in test_loader:

target是正确的标签

在这一行

代码语言:javascript
运行
复制
pred = output.data.max(1, keepdim=True)[1]

pred是您预测的标签

由于它们是在for循环中使用的,因此可以将它们一个接一个地添加到它们自己的数组中,以便以后使用。

代码语言:javascript
运行
复制
y_test = []
predictions = []
...

   y_test.append(target)
   predictions.append(pred)

然后,在for循环的末尾,可以使用ConfusionMatrixDisplay来绘制结果。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/74020233

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档