我在计算模型的准确性、召回率、精确度和 f1 分数时遇到问题
I am having trouble calculating the accuracy, recall, precision and f1-score for my model
我的混淆矩阵工作正常,只是在生成分数时遇到了一些问题。一点帮助将大有帮助。我目前收到错误。 "Tensor object is not callable"。
def get_confused(model_ft):
nb_classes = 120
from sklearn.metrics import precision_recall_fscore_support as score
confusion_matrix = torch.zeros(nb_classes, nb_classes)
with torch.no_grad():
for i, (inputs, classes) in enumerate(dataloaders['val']):
inputs = inputs.to(device)
classes = classes.to(device)
outputs = model_ft(inputs)
_, preds = torch.max(outputs, 1)
for t, p in zip(classes.view(-1), preds.view(-1)):
confusion_matrix[t.long(), p.long()] += 1
cm = confusion_matrix(classes, preds)
recall = np.diag(cm) / np.sum(cm, axis = 1)
precision = np.diag(cm) / np.sum(cm, axis = 0)
print(confusion_matrix)
print(confusion_matrix.diag()/confusion_matrix.sum(1))
这一行有问题。
cm = confusion_matrix(classes, preds)
confusion_matrix
是张量,不能像函数一样调用它。因此 Tensor is not callable
。我也是,不确定你为什么需要这条线。相反,我想你会想写 cm= confusion_matrix.cpu().data.numpy()
使它成为我认为的 numpy 数组。从你的代码来看,cm
似乎是 np.array
.
你可以试试下面的代码,
def F_score(logit, label, threshold=0.5, beta=2):
prob = torch.sigmoid(logit)
prob = prob > threshold
label = label > threshold
TP = (prob & label).sum().float()
TN = ((~prob) & (~label)).sum().float()
FP = (prob & (~label)).sum().float()
FN = ((~prob) & label).sum().float()
accuracy = (TP+TN)/(TP+TN+FP+FN)
precision = torch.mean(TP / (TP + FP + 1e-12))
recall = torch.mean(TP / (TP + FN + 1e-12))
F2 = (1 + beta**2) * precision * recall / (beta**2 * precision + recall + 1e-12)
return accuracy, precision, recall, F2.mean(0)
调用函数为,
accuracy, precision, recall, F1_score = F_score(output.squeeze(), labels.float())
参考:- https://www.kaggle.com/c/human-protein-atlas-image-classification/discussion/73246
我的混淆矩阵工作正常,只是在生成分数时遇到了一些问题。一点帮助将大有帮助。我目前收到错误。 "Tensor object is not callable"。
def get_confused(model_ft):
nb_classes = 120
from sklearn.metrics import precision_recall_fscore_support as score
confusion_matrix = torch.zeros(nb_classes, nb_classes)
with torch.no_grad():
for i, (inputs, classes) in enumerate(dataloaders['val']):
inputs = inputs.to(device)
classes = classes.to(device)
outputs = model_ft(inputs)
_, preds = torch.max(outputs, 1)
for t, p in zip(classes.view(-1), preds.view(-1)):
confusion_matrix[t.long(), p.long()] += 1
cm = confusion_matrix(classes, preds)
recall = np.diag(cm) / np.sum(cm, axis = 1)
precision = np.diag(cm) / np.sum(cm, axis = 0)
print(confusion_matrix)
print(confusion_matrix.diag()/confusion_matrix.sum(1))
这一行有问题。
cm = confusion_matrix(classes, preds)
confusion_matrix
是张量,不能像函数一样调用它。因此 Tensor is not callable
。我也是,不确定你为什么需要这条线。相反,我想你会想写 cm= confusion_matrix.cpu().data.numpy()
使它成为我认为的 numpy 数组。从你的代码来看,cm
似乎是 np.array
.
你可以试试下面的代码,
def F_score(logit, label, threshold=0.5, beta=2):
prob = torch.sigmoid(logit)
prob = prob > threshold
label = label > threshold
TP = (prob & label).sum().float()
TN = ((~prob) & (~label)).sum().float()
FP = (prob & (~label)).sum().float()
FN = ((~prob) & label).sum().float()
accuracy = (TP+TN)/(TP+TN+FP+FN)
precision = torch.mean(TP / (TP + FP + 1e-12))
recall = torch.mean(TP / (TP + FN + 1e-12))
F2 = (1 + beta**2) * precision * recall / (beta**2 * precision + recall + 1e-12)
return accuracy, precision, recall, F2.mean(0)
调用函数为,
accuracy, precision, recall, F1_score = F_score(output.squeeze(), labels.float())
参考:- https://www.kaggle.com/c/human-protein-atlas-image-classification/discussion/73246