【pytorch】使用训练好后的模型权重,在验证集上输出分类的混淆矩阵并保存错误图片

65 篇文章 3 订阅
44 篇文章 4 订阅
该文介绍如何在PyTorch环境中,利用训练好的模型对验证集进行预测,计算混淆矩阵以评估模型性能,并保存预测错误的图片以供进一步分析。通过混淆矩阵,可以深入理解模型在分类任务中的表现,并找出可能存在的问题。
摘要由CSDN通过智能技术生成

在机器学习领域,混淆矩阵是一个非常有用的指标,它可以帮助我们更好地理解模型在验证集上的表现。本文介绍了如何使用pytorch框架,利用训练好后的模型权重,在验证集上输出分类的混淆矩阵,并保存错误图片的方法。

首先,我们需要准备一个pytorch框架的模型,并将模型权重载入到模型中。然后,我们可以使用pytorch的dataloader加载验证集,并使用模型进行预测。接下来,我们可以使用sklearn的confusion_matrix函数,计算出验证集上的混淆矩阵。最后,我们可以获取预测错误的图片,并将它们保存起来,以便后续分析。

总之,本文介绍了如何使用pytorch框架,利用训练好后的模型权重,在验证集上输出分类的混淆矩阵,并保存错误图片的方法。通过使用混淆矩阵,我们可以更好地理解模型在验证集上的表现,并及时发现模型的问题,从而提高模型的准确率。

import matplotlib.pyplot as plt
import torchvision
import torch
import torch.nn as nn
import torchvision.models as models
import torchvision.transforms as transforms
import numpy as np
import torch.nn.functional as F
from PIL import Image
from sklearn.metrics import confusion_matrix
import os
# 加载resnet18模型
resnet18 = models.resnet18(pretrained=False)

# 获取resnet18最后一层输出,输出为512,最后一层本来是用作 分类的,原始网络分为1000类
# 用 softmax函数或者 fully connected 函数,但是用 nn.identtiy() 函数把最后一层替换掉,相当于得到分类之前的特征!
#Identity模块,它将输入直接传递给输出,而不会对输入进行任何变换。
resnet18.fc = nn.Identity()

# 构建新的网络,将resnet18的输出作为输入
class Net(nn.Module):
    def __init__(self):
        super(Net, self).__init__()
        #全卷积神经网络,不用调整输入大小
        self.resnet18 = resnet18
        self.fc1 = nn.Linear(512, 256)
        self.fc2 = nn.Linear(256, 128)
        self.fc3 = nn.Linear(128, 64)
        self.fc4 = nn.Linear(64, 10)
        self.fc5 = nn.Linear(10, 2)
        self.softmax = nn.Softmax(dim=1)
    def forward(self, x):
        x = self.resnet18(x)
        x = F.relu(self.fc1(x))
        x = F.relu(self.fc2(x))
        x = F.relu(self.fc3(x))
        x = F.relu(self.fc4(x))
        x = F.relu(self.fc5(x))
        x = self.softmax(x)
        x=x.view(-1,2)
        return x

# 实例化网络
net = Net()
net.load_state_dict(torch.load('./bestmodel98.4375.pth'))
# 将模型放入GPU
net = net.cuda()

def rgb2bgr(image):
    image = np.array(image)[:, :, ::-1]
    image=Image.fromarray(np.uint8(image))
    return image
transform2 = transforms.Compose([
    transforms.Resize(112),
    # rgb转bgr
    torchvision.transforms.Lambda(rgb2bgr),
    # 入的图片为PIL image 或者 numpy.nadrry格式的图片,其shape为(HxWxC)数值范围在[0,255],转换之后shape为(CxHxw),数值范围在[0,1]
    transforms.ToTensor(),
    # 进行归一化和标准化,Imagenet数据集的均值和方差为:mean=(0.485, 0.456, 0.406),std=(0.229, 0.224, 0.225),
    # 因为这是在百万张图像上计算而得的,所以我们通常见到在训练过程中使用它们做标准化。
    transforms.Normalize(mean=[0.406, 0.456, 0.485], std=[0.225, 0.224, 0.229])
])

val_dataset = torchvision.datasets.ImageFolder(r'D:\eyeDataSet\validate',transform=transform2)
val_loader = torch.utils.data.DataLoader(val_dataset, batch_size=256, shuffle=True)

# 验证集上的表现情况:
correct = 0
total = 0
labelsAll=[]
predictedAll=[]
with torch.no_grad():
    for data in val_loader:
        images, labels = data
        images, labels = images.cuda(), labels.cuda()
        outputs = net(images)
        _, predicted = torch.max(outputs.data, 1)
        total += labels.size(0)
        correct += (predicted == labels).sum().item()
        labelsAll+=labels.cpu()
        predictedAll +=predicted.cpu()

print('Accuracy of the network on the validation images: %.3f %%' % (100 * correct / total))
# 增加混淆矩阵的输出:
y_true = np.array(labelsAll)
y_pred = np.array(predictedAll)
cm = confusion_matrix(y_true, y_pred)
print(cm)
# 替换分类序号与分类名关系:
classes = {}
for index, name in enumerate(val_dataset.class_to_idx):
    classes[index] = name
for i in range(len(cm)):
    for j in range(len(cm[i])):
        print('{} 被预测为 {}: 共{}个'.format(classes[i], classes[j], cm[i][j]))

#将预测失败的图片保存进文件夹:
# 计算预测失败的图片
fail_index=[]
for i in range(len(labelsAll)):
    if labelsAll[i]!=predictedAll[i]:
        fail_index.append(i)

# 将预测失败的图片保存进某指定文件夹内,后缀名为.jpg
for i in fail_index:
    img_name=val_dataset.imgs[i][0]
    img = Image.open(img_name)
    # 检查文件夹是否存在
    if not os.path.exists(r'D:\fail_img'):
        os.makedirs(r'D:\fail_img')
    img.save(r'D:\fail_img\fail_img_'+str(i)+'.jpg')

在这里插入图片描述

  • 1
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
### 回答1: Pytorch分類後驗證要分成兩個步驟。第一步是模型訓練,第二部是對模型訓練所得到的結果進行驗證。 在進行模型訓練時,我們需要確定好使用的訓練集和測試集,以便我們進行結果的評估。在模型訓練的同時,我們可以利用交叉驗證和訓練過程中的驗證方法來評估模型的表現,以便在訓練過程中進行適當的調整。 在模型訓練完成後,我們就可以進行分類後驗證了。這個過程包括了利用訓練好的模型將測試集進行分類,然後根據分類的準確性,來評估模型的表現。通常我們可以利用混淆矩陣來對模型的表現進行評估,同時也可以計算各種評估指標,如Precision、Recall和F1-Score等。 總的來說,pytorch分類後驗證是個很重要的步驟,它可以幫助我們評估模型的表現,並使用這些信息來進行模型調整,以進一步提高模型的性能。 ### 回答2: PyTorch是一个流行的机器学习框架,可用于分类任务。分类任务是指将物体、图像或数据点分组到一个或多个类别中。分类模型通过比较训练数据中的特征来进行分类。在分类过程中,有两个关键步骤:训练和验证。 训练是指利用一组已知的数据,通过模型训练算法得到一个较准确的分类模型。而验证是指利用一组未知的数据,通过该训练好的模型来验证分类准确性。 在PyTorch中,训练和验证可以通过使用DataLoader对象和定义损失函数来进行。同时,还可以通过使用学习率调度程序和优化器来改善模型性能。在验证过程中,需要使用模型来预测未知数据并计算预测结果与实际结果之间的误差。可以利用混淆矩阵、准确率、召回率和F1值等指标来评估模型的性能。 在完成模型训练后,需要进行分类验证。此时需要加载已保存模型,并将验证集数据喂入模型进行预测。将预测结果与验证集标签进行比对,得到模型分类的准确率。 通过以上步骤,可以建立一个适用于分类任务的PyTorch模型,并能够进行验证,最终得到模型的准确性评估,为模型的优化提供指导。 ### 回答3: PyTorch是一个流行的深度学习框架,其中的分类器可以用于验证分类模型的性能。在PyTorch中,分类器被应用于一个测试数据集,以评估模型的准确性和性能。 分类器的工作是将测试数据集中的样本输入到已经训练好的模型中,并输出每个样本的类别。这些类别可以在训练期间定义或由用户在应用程序中定义。分类器将使用模型权重和偏差来计算每个样本的类别概率,并将最高概率的类别作为该样本的最终类别输出。 在分类器中,可以使用许多不同的性能指标来评估模型的性能。常用的指标包括准确率、精确率、召回率和F1得分。这些指标可以用来比较不同模型之间的性能,并帮助研究人员了解他们的模型在不同类型的样本上的表现如何。 针对不同类型的应用程序和数据集,可以根据需求对分类器进行修改和优化。这包括调整分类器中的激活函数、优化器、学习率和迭代次数,以获得更好的性能。通过不断改进分类器,研究人员可以建立更准确和可靠的分类器,以满足各种应用程序的需求。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

颢师傅

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值