in eval-action-recg.py [0:0]
def run_phase(phase, loader, model, optimizer, epoch, args, cfg, logger):
from utils import metrics_utils
batch_time = metrics_utils.AverageMeter('Time', ':6.3f', window_size=100)
data_time = metrics_utils.AverageMeter('Data', ':6.3f', window_size=100)
loss_meter = metrics_utils.AverageMeter('Loss', ':.4e')
top1_meter = metrics_utils.AverageMeter('Acc@1', ':6.2f')
top5_meter = metrics_utils.AverageMeter('Acc@5', ':6.2f')
progress = utils.logger.ProgressMeter(len(loader), meters=[batch_time, data_time, loss_meter, top1_meter, top5_meter],
phase=phase, epoch=epoch, logger=logger)
# switch to train/test mode
model.train(phase == 'train')
if phase in {'test_dense', 'test'}:
model = eval_utils.BatchWrapper(model, cfg['dataset']['batch_size'])
criterion = torch.nn.CrossEntropyLoss()
softmax = torch.nn.Softmax(dim=1)
end = time.time()
logger.add_line('\n{}: Epoch {}'.format(phase, epoch))
for it, sample in enumerate(loader):
data_time.update(time.time() - end)
video = sample['frames']
target = sample['label'].cuda()
if args.gpu is not None:
video = video.cuda(args.gpu, non_blocking=True)
if torch.cuda.device_count() == 1 and args.gpu is None:
video = video.cuda()
# compute outputs
if phase == 'test_dense':
batch_size, clips_per_sample = video.shape[0], video.shape[1]
video = video.flatten(0, 1).contiguous()
if phase == 'train':
logits = model(video)
else:
with torch.no_grad():
logits = model(video)
# compute loss and accuracy
if phase == 'test_dense':
confidence = softmax(logits).view(batch_size, clips_per_sample, -1).mean(1)
labels_tiled = target.unsqueeze(1).repeat(1, clips_per_sample).view(-1)
loss = criterion(logits, labels_tiled)
else:
confidence = softmax(logits)
loss = criterion(logits, target)
with torch.no_grad():
acc1, acc5 = metrics_utils.accuracy(confidence, target, topk=(1, 5))
loss_meter.update(loss.item(), target.size(0))
top1_meter.update(acc1[0], target.size(0))
top5_meter.update(acc5[0], target.size(0))
# compute gradient and do SGD step
if phase == 'train':
optimizer.zero_grad()
loss.backward()
optimizer.step()
# measure elapsed time
batch_time.update(time.time() - end)
end = time.time()
if (it + 1) % 100 == 0 or it == 0 or it + 1 == len(loader):
progress.display(it+1)
if args.distributed:
progress.synchronize_meters(args.gpu)
progress.display(len(loader) * args.world_size)
return top1_meter.avg, top5_meter.avg