一、模型中的函数的定义
1.torchmetrics.AUROC
(1).binary
>>> from torch import tensor
>>> preds = tensor([0.13, 0.26, 0.08, 0.19, 0.34])
>>> target = tensor([0, 0, 1, 1, 1])
>>> auroc = AUROC(task="binary")
>>> auroc(preds, target)
tensor(0.5000)
(2).multiclass
>>> preds = tensor([[0.90, 0.05, 0.05],
... [0.05, 0.90, 0.05],
... [0.05, 0.05, 0.90],
... [0.85, 0.05, 0.10],
... [0.10, 0.10, 0.80]])
>>> target = tensor([0, 1, 1, 2, 2])
>>> auroc = AUROC(task="multiclass", num_classes=3)
>>> auroc(preds, target)
tensor(0.7778)
注意函数中average参数的默认值为“macro”。
二、test_k_fold_test_copy.py—.logs_k_fold/result_draw
# Test script
def test(model, test_loader, writer, device,criterion,roc_path,fold):
model.eval()
accuracy = Accuracy(task='multiclass', num_classes=2).to(device)
precision = Precision(task='multiclass', average='macro', num_classes=2).to(device)
recall = Recall(task='multiclass', average='macro', num_classes=2).to(device)
auroc = AUROC(task='multiclass',num_classes=2).to(device)
f1 = F1Score(num_classes=2, task='multiclass', average='macro').to(device)
specificity=Specificity(num_classes=2, task='multiclass', average='macro').to(device)
pred_scores = []
true_labels = []
pred_labels = []
fold_results={}
with torch.no_grad():
for images, coords, labels, _, _ in test_loader:
images = images.to(device)
labels = labels.to(device)
outputs = model(images,coords)
_, predicted = torch.max(outputs.data, 1)
accuracy(predicted, labels.data)
precision(predicted, labels.data)
recall(predicted, labels.data)
f1(predicted, labels.data)
#auroc(predicted, labels.data)
specificity(predicted, labels.data)
auroc(outputs, labels.data)
pred_labels.extend(predicted.cpu().numpy())
pred_scores.extend(outputs.cpu().numpy())
true_labels.extend(labels.cpu().numpy())
acc = accuracy.compute().item()
prec = precision.compute().item()
rec = recall.compute().item()
f1_score = f1.compute().item()
auroc_score = auroc.compute().item()
spec=specificity.compute().item()
fold_results['fold']=fold
fold_results['accuracy'] = acc
fold_results['precision'] = prec
fold_results['recall'] = rec
fold_results['f1_score'] = f1_score
fold_results['auroc_score'] = auroc_score
fold_results['specificity'] = spec
logging.info(f"Test Accuracy: {acc:.4f}, Test precision: {prec:.4f}, Test recall: {rec:.4f}, Test f1: {f1_score:.4f}, Test auroc: {auroc_score:4f},Test specificity:{spec:.4f}")
logging.error("This is a fatal log!")
roc = MulticlassROC(num_classes=2, thresholds=None)
pred_scores = torch.Tensor(pred_scores).to(device)
true_labels = torch.Tensor(true_labels).int().to(device)
fpr, tpr, thresholds = roc(pred_scores, true_labels)
draw_fold_path = Path(os.path.join(fprs_tprs_path, f'fold_{fold}'))
draw_fold_path.mkdir(parents=True, exist_ok=True)
torch.save(tpr,os.path.join(draw_fold_path,"tpr.pt"))
torch.save(fpr,os.path.join(draw_fold_path,"fpr.pt"))
return fold_results, fpr, tpr