class_num=5 # 分类数
confusion_matrix = torchnet.meter.ConfusionMeter(class_num)
# 使用torchnet包创建5分类混淆矩阵
# 每运行完一个batch 迭代混淆矩阵
for ii, (val_input, label) in enumerate(dataloader):
val_input = val_input.to(opt.device)
score = model(val_input)
confusion_matrix.add(score.detach().squeeze(), label.type(torch.LongTensor))
cm_value = confusion_matrix.value() # 5x5 numpy数组
TP, FN, FP, TN = [[], [], [], []]
for i in range(class_num):
tp = cm_value[i][i]
fn = cm_value[:, i].sum() - cm_value[i][i]
fp = cm_value[i, :].sum() - cm_value[i][i]
tn = cm_value.sum() - tp - fn - fp
TP.append(tp)
FN.append(fn)
FP.append(fp)
TN.append(tn)
'''计算准确率和Macro-F1'''
accuracy = 100. * (sum(TP)) / (cm_value.sum()) # 准确率
Macro_F1s = []
for i in range(class_num):
P_i = 0.0 if math.isnan(TP[i] / (TP[i] + FP[i])) else 100.*TP[i] / (TP[i] + FP[i])
# i类别的精准率
R_i = 0.0 if math.isnan(TP[i] / (TP[i] + FN[i])) else 100.*TP[i] / (TP[i] + FN[i])
# i类别的召回率
F1_i = 0.0 if math.isnan(2 * P_i * R_i / P_i + R_i) else 2 * P_i * R_i / P_i + R_i
Macro_F1s.append(F1_i)
Macro_F1s = np.array(Macro_F1s)
Macro_F1 = Macro_F1s.mean()
示例代码,不可运行,