| 259 | |
| 260 | @torch.no_grad() |
| 261 | def eval_epoch(*, config, data_loader, model, accelerator: Accelerator): |
| 262 | model.eval() |
| 263 | |
| 264 | acc1_meter = AverageMeter() |
| 265 | acc5_meter = AverageMeter() |
| 266 | |
| 267 | for idx, (images, target) in enumerate(tqdm(data_loader, disable=accelerator.is_main_process)): |
| 268 | output = model(images) |
| 269 | |
| 270 | # convert 22k to 1k to evaluate |
| 271 | if output.size(-1) == 21841: |
| 272 | convert_file = './meta_data/map22kto1k.txt' |
| 273 | with open(convert_file, 'r') as f: |
| 274 | convert_list = [int(line) for line in f.readlines()] |
| 275 | output = output[:, convert_list] |
| 276 | |
| 277 | acc1, acc5 = accuracy(output, target, topk=(1, 5)) |
| 278 | acc1 = accelerator.gather(acc1).mean(0) |
| 279 | acc5 = accelerator.gather(acc5).mean(0) |
| 280 | |
| 281 | acc1_meter.update(acc1.item(), target.size(0)) |
| 282 | acc5_meter.update(acc5.item(), target.size(0)) |
| 283 | |
| 284 | if (idx + 1) % config.PRINT_FREQ == 0 or idx + 1 == len(data_loader): |
| 285 | logger.info(f'Test: [{idx+1}/{len(data_loader)}]\t' |
| 286 | f'Acc@1 {acc1_meter.val:.3f} ({acc1_meter.avg:.3f})\t' |
| 287 | f'Acc@5 {acc5_meter.val:.3f} ({acc5_meter.avg:.3f})\t' |
| 288 | ) |
| 289 | return acc1_meter.avg |
| 290 | |
| 291 | |
| 292 | def eval(config, accelerator: Accelerator): |