# 10分类的验证结果 做一个DF 行 为一条记录    列名为 分类名和预测的结果这一个类的概率 预测结果和实际结果 这样可以跟直观的观察每一个验证过程

# 然后转为Excel

import torch

import torch.nn as nn

import numpy as np

import pandas as pd

import matplotlib.pyplot as plt

from torch.utils.data import DataLoader

from torchvision.datasets import MNIST

from torchvision import transforms

from sklearn.metrics import *

# 先获得一下验证集

def demo1():

    val_data=MNIST(root="assets",train=False,download=False,transform=transforms.Compose([transforms.ToTensor(),transforms.Resize((32,32))]))

    # 验证集太多分批次进行验证

    data_loader1=DataLoader(val_data,batch_size=16,shuffle=True)

    # 模型 这里直接定义一个算了

    class MyNet(nn.Module):

        def __init__(self, *args, **kwargs):

            super().__init__(*args, **kwargs)

            # 这里是可以看别人网路的图来指定网络  s代表池化 c代表卷积 layer代表线性

            self.hidden1=nn.Sequential(nn.Conv2d(1,6,kernel_size=5),nn.ReLU())

            self.hidden2=nn.Sequential(nn.MaxPool2d(kernel_size=2,stride=2))

            self.hidden3=nn.Sequential(nn.Conv2d(6,16,kernel_size=5),nn.ReLU())

            # 线性层要拉平算

            self.hidden4=nn.Sequential(nn.Linear(16*5*5,120),nn.ReLU())

            self.hidden5=nn.Sequential(nn.Linear(120,84),nn.ReLU())

            self.out=nn.Sequential(nn.Linear(84,10),nn.Softmax(dim=1))

        def forward(self,x):

            x=self.hidden1(x)

            x=self.hidden2(x)

            x=self.hidden3(x)

            x=self.hidden2(x)

            x=x.view(x.shape[0],-1)

            x=self.hidden4(x)

            x=self.hidden5(x)

            return self.out(x)

    # 实例模型 并且加载权重

    net1=MyNet()

    net1.load_state_dict(torch.load("assets\model1.pt",weights_only=True))

    # net1.eval()

    # 验证

    # 先把tensor转为numpy 然后numpy转为一个大的DF 在转excel

   

    arr1=np.zeros((0,12))

    # print(arr1)

    with torch.no_grad():

        for val_x,val_y in data_loader1:

            y_pre=net1(val_x)

            res=torch.argmax(y_pre,dim=1)

            y_pre_chance=y_pre.numpy().copy()

            # print(y_pre_chance.shape)

            y_ture=val_y.numpy().copy()

            # print(y_ture.shape)

            y_pre_res_np=res.numpy().copy()

            # print(y_pre_res_np.shape)

            # 拼接np  y_pre_res_np   y_ture

            y2=np.stack((y_pre_res_np,y_ture),axis=1)

            # print(y2.shape)

            arr2=np.concatenate((y_pre_chance,y2),axis=1)

            # print(arr2.shape)

            arr3=np.concatenate((arr1,arr2),axis=0)

            arr1=arr3

    df1=pd.DataFrame(data=arr1,columns=[0,1,2,3,4,5,6,7,8,9,"y_pre","y_true"])

    df1.to_csv("assets/res1.csv")


 

# 混淆矩阵

# TP    真的正向  FP 假的正向  TN 真的负向 FN 假的负向

# 准确度  TP+TN /(TP+FP+TN+FN)

# 精确度  真的正向/预测是正向 TP/(TP+FP)

# 召回率  真的正向/全部的真值为正向的  TP/(TP+FN)   (TP+FN)是本来是正向的 被预测是正向或者负向

# 精确度和召回率 为一个反关系 有一个F1分数平均一下他们两个 2*  精确度*召回率 /精确度+召回率

#

# 报表模块的使用 sklearn 里面的 metrics 的  classification_report 生成 准确度 精确度 召回率 F1分数

def demo2():

    df1=pd.read_csv(r"assets\res1.csv")

    predict=df1["y_pre"].values

    y=df1["y_true"].values

    report=classification_report(y,predict) # 传入真实值 预测值

    # print(report)

    # 可视化 报表

    # 生成混淆矩阵 使用

    matrix=confusion_matrix(y,predict)

    print(matrix)

    # 可视化混淆矩阵

    plt.matshow(matrix,cmap=plt.cm.Greens)

    for i in range(len(matrix)):

        for j in range(len(matrix)):

            plt.annotate(

                matrix[i,j],

                xy=(j,i),

                horizontalalignment="center",

                verticalalignment="center",

            )

    plt.xlabel("Predicted labels")

    plt.ylabel("True labels")

    # plt.yticks(range(len(y)), y, rotation=45)

    # plt.xticks(range(len(y)), y)

    # plt.title("训练结果混淆矩阵视图")

    plt.show()

   

if __name__=="__main__":

    # demo1()    

    demo2()

    pass

Logo

永洪科技,致力于打造全球领先的数据技术厂商,具备从数据应用方案咨询、BI、AIGC智能分析、数字孪生、数据资产、数据治理、数据实施的端到端大数据价值服务能力。

更多推荐