微信官方免费下载,山东seo网页优化外包,上海网站空间租用,aspx网站html静态化怎么做关于混淆矩阵#xff0c;各位可以在这里了解#xff1a;混淆矩阵细致理解_夏天是冰红茶的博客-CSDN博客
上一篇中我们了解了混淆矩阵#xff0c;并且进行了类定义#xff0c;那么在这一节中我们将要对其进行扩展#xff0c;在多分类中#xff0c;如何去计算TP#xff0…关于混淆矩阵各位可以在这里了解混淆矩阵细致理解_夏天是冰红茶的博客-CSDN博客
上一篇中我们了解了混淆矩阵并且进行了类定义那么在这一节中我们将要对其进行扩展在多分类中如何去计算TPTNFNFP。
原理推导
这里以三分类为例这里来看看TPTNFNFP是怎么分布的。
类别1的标签 类别2的标签 类别3的标签 这样我们就能知道了混淆矩阵的对角线就是TP
TP torch.diag(h) 假正例FP是模型错误地将负类别样本分类为正类别的数量
FP torch.sum(h, dim1) - TP
假负例FN是模型错误地将正类别样本分类为负类别的数量
FN torch.sum(h, dim0) - TP
最后用总数减去除了 TP 的其他三个元素之和得到 TN
TN torch.sum(h) - (torch.sum(h, dim0) torch.sum(h, dim1) - TP)
逻辑验证
这里借用上一篇的例子假如我们这个混淆矩阵是这样的 tensor([[2, 0, 0], [0, 1, 1], [0, 2, 0]]) 为了方便讲解这里我们对其进行一个简单的编号即0—8
012345678
torch.sum(h, dim1) 可得 tensor([2., 2., 2.]) torch.sum(h, dim0) 可得 tensor([2., 3., 1.]) 。 TP: tensor([2., 1., 0.]) FP: tensor([0., 1., 2.]) TN: tensor([4., 2., 3.]) FN: tensor([0., 2., 1.])
我们先来看看TP的构成对应着矩阵的对角线210FP在类别1中占36号位在类别2中占17号位在类别3中占25号位加起来即为012TN在类别1中占4578号位在类别2中占边角位在类别3中占0134号位加起来即为423FN在类别1中占12号位在类别2中占35号位在类别3中占67号位加起来即为021。
补充类定义
import torch
import numpy as npclass ConfusionMatrix(object):def __init__(self, num_classes):self.num_classes num_classesself.mat Nonedef update(self, t, p):n self.num_classesif self.mat is None:# 创建混淆矩阵self.mat torch.zeros((n, n), dtypetorch.int64, devicet.device)with torch.no_grad():# 寻找GT中为目标的像素索引k (t 0) (t n)# 统计像素真实类别t[k]被预测成类别p[k]的个数inds n * t[k].to(torch.int64) p[k]self.mat torch.bincount(inds, minlengthn**2).reshape(n, n)def reset(self):if self.mat is not None:self.mat.zero_()propertydef ravel(self):计算混淆矩阵的TN, FP, FN, TPh self.mat.float()n self.num_classesif n 2:TP, FN, FP, TN h.flatten()return TP, FN, FP, TNif n 2:TP h.diag()FN h.sum(dim1) - TPFP h.sum(dim0) - TPTN torch.sum(h) - (torch.sum(h, dim0) torch.sum(h, dim1) - TP)return TP, FN, FP, TNdef compute(self):主要在eval的时候使用,你可以调用ravel获得TN, FP, FN, TP, 进行其他指标的计算计算全局预测准确率(混淆矩阵的对角线为预测正确的个数)计算每个类别的准确率计算每个类别预测与真实目标的iou,IoU TP / (TP FP FN)h self.mat.float()acc_global torch.diag(h).sum() / h.sum()acc torch.diag(h) / h.sum(1)iu torch.diag(h) / (h.sum(1) h.sum(0) - torch.diag(h))return acc_global, acc, iudef __str__(self):acc_global, acc, iu self.compute()return (global correct: {:.1f}\naverage row correct: {}\nIoU: {}\nmean IoU: {:.1f}).format(acc_global.item() * 100,[{:.1f}.format(i) for i in (acc * 100).tolist()],[{:.1f}.format(i) for i in (iu * 100).tolist()],iu.mean().item() * 100)
我在代码中添加了属性修饰器以便我们可以直接的进行调用并且也考虑到了二分类与多分类不同的情况。
性能指标
关于这些指标在网上有很多介绍这里就不细讲了
class ModelIndex():def __init__(self,TP, FN, FP, TN, e1e-5):self.TN TNself.FP FPself.FN FNself.TP TPself.e edef Precision(self):精确度衡量了正类别预测的准确性return self.TP / (self.TP self.FP self.e)def Recall(self):召回率衡量了模型对正类别样本的识别能力return self.TP / (self.TP self.FN self.e)def IOU(self):表示模型预测的区域与真实区域之间的重叠程度return self.TP / (self.TP self.FP self.FN self.e)def F1Score(self):F1分数是精确度和召回率的调和平均数p self.Precision()r self.Recall()return 2*p*r / (p r self.e)def Specificity(self):特异性是指模型在负类别样本中的识别能力return self.TN / (self.TN self.FP self.e)def Accuracy(self):准确度是模型正确分类的样本数量与总样本数量之比return self.TP self.TN / (self.TP self.TN self.FP self.FN self.e)def FP_rate(self):False Positive Rate,假阳率是模型将负类别样本错误分类为正类别的比例return self.FP / (self.FP self.TN self.e)def FN_rate(self):False Negative Rate,假阴率是模型将正类别样本错误分类为负类别的比例return self.FN / (self.FN self.TP self.e)def Qualityfactor(self):品质因子综合考虑了召回率和特异性r self.Recall()s self.Specificity()return rs-1
参考文章多分类中TP/TN/FP/FN的计算_Hello_Chan的博客-CSDN博客