12.05 深度学习-验证结果可视化
10分类的验证结果 做一个DF 行 为一条记录列名为 分类名和预测的结果这一个类的概率 预测结果和实际结果 这样可以跟直观的观察每一个验证过程。# 报表模块的使用 sklearn 里面的 metrics 的classification_report 生成 准确度 精确度 召回率 F1分数。# 召回率真的正向/全部的真值为正向的TP/(TP+FN)(TP+FN)是本来是正向的 被预测是正向或者负向。
# 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
更多推荐


所有评论(0)