(self, eval_loader=None, args=None)
| 231 | |
| 232 | @torch.no_grad() |
| 233 | def evaluate(self, eval_loader=None, args=None): |
| 234 | self.model.eval() |
| 235 | self.ema.apply_shadow() |
| 236 | if eval_loader is None: |
| 237 | eval_loader = self.loader_dict['eval'] |
| 238 | total_loss = 0.0 |
| 239 | total_num = 0.0 |
| 240 | y_true = [] |
| 241 | y_pred = [] |
| 242 | y_logits = [] |
| 243 | for _, x, y in eval_loader: |
| 244 | x, y = x.cuda(args.gpu), y.cuda(args.gpu) |
| 245 | num_batch = x.shape[0] |
| 246 | total_num += num_batch |
| 247 | logits = self.model(x) |
| 248 | loss = F.cross_entropy(logits, y, reduction='mean') |
| 249 | y_true.extend(y.cpu().tolist()) |
| 250 | y_pred.extend(torch.max(logits, dim=-1)[1].cpu().tolist()) |
| 251 | y_logits.extend(torch.softmax(logits, dim=-1).cpu().tolist()) |
| 252 | total_loss += loss.detach() * num_batch |
| 253 | top1 = accuracy_score(y_true, y_pred) |
| 254 | top5 = top_k_accuracy_score(y_true, y_logits, k=5) |
| 255 | precision = precision_score(y_true, y_pred, average='macro') |
| 256 | recall = recall_score(y_true, y_pred, average='macro') |
| 257 | F1 = f1_score(y_true, y_pred, average='macro') |
| 258 | AUC = roc_auc_score(y_true, y_logits, multi_class='ovo') |
| 259 | |
| 260 | cf_mat = confusion_matrix(y_true, y_pred, normalize='true') |
| 261 | self.print_fn('confusion matrix:\n' + np.array_str(cf_mat)) |
| 262 | self.ema.restore() |
| 263 | self.model.train() |
| 264 | return {'eval/loss': total_loss / total_num, 'eval/top-1-acc': top1, 'eval/top-5-acc': top5, |
| 265 | 'eval/precision': precision, 'eval/recall': recall, 'eval/F1': F1, 'eval/AUC': AUC} |
| 266 | |
| 267 | def save_model(self, save_name, save_path): |
| 268 | save_filename = os.path.join(save_path, save_name) |
no test coverage detected