(self, val_loader, epoch_idx)
| 115 | return top1, loss, self.lr_ |
| 116 | |
| 117 | def val_multi_class(self, val_loader, epoch_idx): |
| 118 | np.set_printoptions(suppress=True) |
| 119 | starttime = datetime.datetime.now() |
| 120 | # switch to train mode |
| 121 | self.netloc_.eval() |
| 122 | self.loss_meter_.reset() |
| 123 | self.top1_meter_.reset() |
| 124 | self.all_probs = [] |
| 125 | self.all_labels = [] |
| 126 | # eval |
| 127 | with torch.no_grad(): |
| 128 | val_loader = tqdm(val_loader, desc='valid', ascii=True) |
| 129 | for imgs_idx, (imgs_tensor, imgs_label, _, _) in enumerate(val_loader): |
| 130 | # set cuda |
| 131 | imgs_tensor = imgs_tensor.cuda() |
| 132 | imgs_label = imgs_label.cuda() |
| 133 | # calc forward |
| 134 | preds = self.netloc_(imgs_tensor) |
| 135 | # calc acc & loss |
| 136 | loss = self.criterion_(preds, imgs_label) |
| 137 | # accumulate loss & acc |
| 138 | acc1 = simple_accuracy(preds, imgs_label) |
| 139 | |
| 140 | outputs_scores = nn.functional.softmax(preds, dim=1) |
| 141 | outputs_scores = torch.cat((outputs_scores, imgs_label.unsqueeze(-1)), dim=-1) |
| 142 | |
| 143 | if self.DDP: |
| 144 | loss = reduce_tensor(loss, self.world_size) |
| 145 | acc1 = reduce_tensor(acc1, self.world_size) |
| 146 | outputs_scores = gather_tensor(outputs_scores, self.world_size) |
| 147 | |
| 148 | outputs_scores, label = outputs_scores[:, -2], outputs_scores[:, -1] |
| 149 | self.all_probs += [float(i) for i in outputs_scores] |
| 150 | self.all_labels += [ float(i) for i in label] |
| 151 | self.loss_meter_.update(loss.item()) |
| 152 | self.top1_meter_.update(acc1.item()) |
| 153 | # eval |
| 154 | top1 = self.top1_meter_.mean |
| 155 | loss = self.loss_meter_.mean |
| 156 | auc = roc_auc_score(self.all_labels, self.all_probs) |
| 157 | |
| 158 | endtime = datetime.datetime.now() |
| 159 | if self.local_rank == 0: |
| 160 | print('log: epoch-%d, val_top1 is %f, val_loss is %f, auc is %f, time is %d' % ( |
| 161 | epoch_idx, top1, loss, auc, (endtime - starttime).seconds)) |
| 162 | |
| 163 | # update lr |
| 164 | self.scheduler_.step() |
| 165 | |
| 166 | # return |
| 167 | return top1, loss, auc |
| 168 | |
| 169 | def val_ema(self, val_loader, epoch_idx): |
| 170 | np.set_printoptions(suppress=True) |
no test coverage detected