深度学习模型评估:如何计算TN值和特异性
在深度学习模型评估中,除了常见的指标如精度、召回率和F1分数外,特异性(Specificity)也是一个重要的指标,它衡量了模型在识别负样本方面的能力。特异性计算公式为:TN / (TN + FP),其中TN代表真负样本的数量,FP代表假正样本的数量。
以下代码展示了如何计算TN值和特异性,并补充了之前代码中关于TN的计算部分。
def eval_net(net, dataset, slicetotal, batch_size=12, gpu=True):
"""Evaluation without the densecrf with the dice coefficient"""
net.eval()
start = time.time()
dice_ = torch.zeros(14).cuda()
jac_ = torch.zeros(14).cuda()
NE = torch.zeros(14).cuda()
JNE = torch.zeros(14).cuda()
accuracy_ = torch.zeros(14).cuda()
precision_ = torch.zeros(14).cuda()
recall_ = torch.zeros(14).cuda()
specificity_ = torch.zeros(14).cuda()
print(1)
with torch.no_grad():
for i, b in enumerate(batch(dataset, batch_size)):
imgs = np.array([k[0] for k in b]).astype(np.float32)
true_masks = np.array([k[1] for k in b])
imgs = torch.from_numpy(imgs)
imgs = imgs.unsqueeze(1)
true_masks = torch.from_numpy(true_masks)
pre_masks_eval = torch.zeros(true_masks.shape[0],14,256,256)
true_masks_eval = torch.zeros(true_masks.shape[0],14,256,256)
batchshape = true_masks.shape[0]
batch_dice = torch.zeros(14).cuda()
if gpu:
imgs = imgs.cuda()
true_masks = true_masks.cuda()
net.cuda()
output_img = net(imgs)
input = output_img.cuda()
pre_masks = input.max(1)[1].float() #索引代表像素所属类别的数字
for ak in range(14):
if ak == 0:
continue
pre_masks_eval[:,ak] = (pre_masks==ak)
true_masks_eval[:,ak] = (true_masks==ak)
premasks = pre_masks_eval[:,ak].view(true_masks.shape[0],-1)
truemasks = true_masks_eval[:,ak].view(true_masks.shape[0],-1)
intersection = premasks * truemasks
TP = intersection.sum(1)
FP = premasks.sum(1) - TP
FN = truemasks.sum(1) - TP
TN = torch.zeros(14).cuda()
for bk in range(true_masks.shape[0]):
if TP[bk] == 0 and FP[bk] == 0 and FN[bk] == 0:
NE[ak] += 1
JNE[ak] += 1
else:
batch_dice[ak] = batch_dice[ak] + 2*TP[bk] / (2*TP[bk] + FP[bk] + FN[bk])
jac_[ak] = jac_[ak] + TP[bk] / (TP[bk] + FP[bk] + FN[bk])
TN[ak] += batchshape - TP[bk] - FP[bk] - FN[bk]
dice_ = dice_ + batch_dice
for knum in range(14):
dice_[knum] = dice_[knum] / (slicetotal - NE[knum])
jac_[knum] = jac_[knum] / (slicetotal - JNE[knum])
specificity_[knum] = TN[knum] / (TN[knum] + FP[knum])
end = time.time()
print('time used:',end - start)
return dice_,jac_```
在上面的代码中,我们首先创建了一个大小为14的零张量TN,用于存储每个类别的TN值。然后,在循环中,我们根据每个类别的TP、FP、FN和batchshape的值计算TN。最后,我们用TN[ak]除以(TN[ak] + FP[ak])来计算每个类别的特异性值。
通过计算特异性值,我们可以更好地了解模型在识别负样本方面的能力。例如,如果模型在某些类别上的特异性较低,则意味着模型在识别这些类别的负样本时容易出错。
希望以上内容能够帮助您理解如何计算TN值和特异性,并将其应用到您的深度学习模型评估中。
原文地址: https://www.cveoy.top/t/topic/fRTF 著作权归作者所有。请勿转载和采集!