(config, data_loader, model, epoch=None)
| 280 | |
| 281 | @torch.no_grad() |
| 282 | def eval_epoch(config, data_loader, model, epoch=None): |
| 283 | criterion = torch.nn.CrossEntropyLoss() |
| 284 | model.eval() |
| 285 | |
| 286 | batch_time = AverageMeter() |
| 287 | loss_meter = AverageMeter() |
| 288 | acc1_meter = AverageMeter() |
| 289 | acc5_meter = AverageMeter() |
| 290 | |
| 291 | end = time.time() |
| 292 | for idx, (images, target) in enumerate(data_loader): |
| 293 | images = images.cuda(non_blocking=True) |
| 294 | target = target.cuda(non_blocking=True) |
| 295 | output = model(images) |
| 296 | |
| 297 | # convert 22k to 1k to evaluate |
| 298 | if output.size(-1) == 21841: |
| 299 | convert_file = './meta_data/map22kto1k.txt' |
| 300 | with open(convert_file, 'r') as f: |
| 301 | convert_list = [int(line) for line in f.readlines()] |
| 302 | output = output[:, convert_list] |
| 303 | |
| 304 | # measure accuracy and record loss |
| 305 | loss = criterion(output, target) |
| 306 | acc1, acc5 = accuracy(output, target, topk=(1, 5)) |
| 307 | |
| 308 | acc1 = reduce_tensor(acc1) |
| 309 | acc5 = reduce_tensor(acc5) |
| 310 | loss = reduce_tensor(loss) |
| 311 | |
| 312 | loss_meter.update(loss.item(), target.size(0)) |
| 313 | acc1_meter.update(acc1.item(), target.size(0)) |
| 314 | acc5_meter.update(acc5.item(), target.size(0)) |
| 315 | |
| 316 | # measure elapsed time |
| 317 | batch_time.update(time.time() - end) |
| 318 | end = time.time() |
| 319 | |
| 320 | if idx % config.PRINT_FREQ == 0: |
| 321 | memory_used = torch.cuda.max_memory_allocated() / (1024.0 * 1024.0) |
| 322 | logger.info(f'Test: [{idx}/{len(data_loader)}]\t' |
| 323 | f'Time {batch_time.val:.3f} ({batch_time.avg:.3f})\t' |
| 324 | f'Loss {loss_meter.val:.4f} ({loss_meter.avg:.4f})\t' |
| 325 | f'Acc@1 {acc1_meter.val:.3f} ({acc1_meter.avg:.3f})\t' |
| 326 | f'Acc@5 {acc5_meter.val:.3f} ({acc5_meter.avg:.3f})\t' |
| 327 | f'Mem {memory_used:.0f}MB') |
| 328 | if epoch is not None: |
| 329 | logger.info(f'[Epoch:{epoch}] * Acc@1 {acc1_meter.avg:.3f} Acc@5 {acc5_meter.avg:.3f}') |
| 330 | else: |
| 331 | logger.info(f' * Acc@1 {acc1_meter.avg:.3f} Acc@5 {acc5_meter.avg:.3f}') |
| 332 | |
| 333 | return acc1_meter.avg, acc5_meter.avg, loss_meter.avg |
| 334 | |
| 335 | |
| 336 | def train(config, ds_config): |
no test coverage detected