| import torch
|
| from torchmetrics import F1Score, Accuracy, AveragePrecision, AUROC
|
|
|
|
|
| def train(args, epoch, model, train_loader, valid_loader, device, criterion, optimizer):
|
| train_loss = 0
|
| num_labels = model.out_dim
|
| avg = args.metric_avg
|
| if num_labels == 1:
|
| task = 'binary'
|
| else:
|
| task = 'multilabel'
|
| metric_macro_acc = Accuracy(average=avg, task=task, num_labels=num_labels, threshold=0.5).to(device)
|
| metric_macro_f1 = F1Score(average=avg, task=task, num_labels=num_labels, threshold=0.5).to(device)
|
| metric_macro_ap = AveragePrecision(average=avg, task=task, num_labels=num_labels).to(device)
|
| metric_auc = AUROC(average=avg, task=task, num_labels=num_labels).to(device)
|
|
|
| if train_loader is not None:
|
| model.train()
|
| for data in train_loader:
|
| data = data.to(device)
|
|
|
| out = model(data)
|
|
|
|
|
| loss = criterion(out, torch.tensor(data.gt, dtype=torch.float, device=device))
|
|
|
|
|
|
|
|
|
| loss.backward()
|
| optimizer.step()
|
| optimizer.zero_grad()
|
| train_loss += loss.item()
|
|
|
| model.eval()
|
| preds = []
|
| gt_list_valid = []
|
| with torch.no_grad():
|
| for data in valid_loader:
|
| data = data.to(device)
|
| gt_list_valid.append(torch.tensor(data.gt, device=device))
|
| out = model(data)
|
| preds.append(out)
|
|
|
|
|
| preds = torch.nn.functional.sigmoid(torch.cat(preds, dim=0))
|
| gt_list_valid = torch.cat(gt_list_valid, dim=0).int()
|
|
|
| macro_ap = metric_macro_ap(preds, gt_list_valid).item()
|
|
|
| macro_auc = metric_auc(preds, gt_list_valid).item()
|
| macro_f1 = metric_macro_f1(preds, gt_list_valid).item()
|
| macro_acc = metric_macro_acc(preds, gt_list_valid).item()
|
| return train_loss, macro_ap, macro_f1, macro_acc, macro_auc
|
|
|
|
|