in eval-action-recg-linear.py [0:0]
def run_phase(phase, loader, model, optimizer, epoch, args, cfg, logger):
from utils import metrics_utils
logger.add_line('\n{}: Epoch {}'.format(phase, epoch))
feature_names = cfg['model']['args']['feat_names']
batch_time = metrics_utils.AverageMeter('Time', ':6.3f', 100)
data_time = metrics_utils.AverageMeter('Data', ':6.3f', 100)
loss_meters = {ft: metrics_utils.AverageMeter('Loss', ':.4e', 0) for ft in feature_names}
top1_meters = {ft: metrics_utils.AverageMeter('Acc@1', ':6.2f', 0) for ft in feature_names}
top5_meters = {ft: metrics_utils.AverageMeter('Acc@5', ':6.2f', 0) for ft in feature_names}
progress = {'timers': utils.logger.ProgressMeter(len(loader), meters=[batch_time, data_time], phase=phase, epoch=epoch, logger=logger)}
progress.update({ft: utils.logger.ProgressMeter(len(loader), meters=[loss_meters[ft], top1_meters[ft], top5_meters[ft]], phase=phase, epoch=epoch, logger=logger) for ft in feature_names})
# switch to train/test mode
model.train(phase == 'train')
if phase in {'test_dense', 'test'}:
model = BatchWrapper(model, cfg['dataset']['batch_size'])
end = time.time()
criterion = torch.nn.CrossEntropyLoss()
softmax = torch.nn.Softmax(dim=1)
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 phase == 'test_dense':
batch_size, clips_per_sample = video.shape[0], video.shape[1]
video = video.flatten(0, 1).contiguous()
# compute outputs
if phase == 'train':
logits = model(video)
else:
with torch.no_grad():
logits = model(video)
# compute loss and measure accuracy
total_loss = 0.
for ft in feature_names:
if phase == 'test_dense':
confidence = softmax(logits[ft]).view(batch_size, clips_per_sample, -1).mean(1)
target_tiled = target.unsqueeze(1).repeat(1, clips_per_sample).view(-1)
loss = criterion(logits[ft], target_tiled)
else:
confidence = softmax(logits[ft])
loss = criterion(logits[ft], target)
total_loss += loss
with torch.no_grad():
acc1, acc5 = metrics_utils.accuracy(confidence, target, topk=(1, 5))
loss_meters[ft].update(loss.item(), target.size(0))
top1_meters[ft].update(acc1[0].item(), target.size(0))
top5_meters[ft].update(acc5[0].item(), target.size(0))
# compute gradient and do SGD step
if phase == 'train':
optimizer.zero_grad()
total_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):
for ft in progress:
progress[ft].display(it+1)
if args.distributed:
for ft in progress:
progress[ft].synchronize_meters(args.gpu)
progress[ft].display(len(loader) * args.world_size)
return {ft: top1_meters[ft].avg for ft in feature_names}, {ft: top5_meters[ft].avg for ft in feature_names}