in eval_video.py [0:0]
def evaluate(model, val_loader, epoch=0, writer=None, ds='hmdb51'):
batch_time = AverageMeter()
losses = AverageMeter()
top1 = AverageMeter()
top5 = AverageMeter()
# switch to evaluate mode
model.eval()
# dicts to store labels and softmaxes
softmaxes = {}
labels = {}
criterion = nn.CrossEntropyLoss().cuda()
with torch.no_grad():
end = time.perf_counter()
for batch_idx, batch in enumerate(val_loader):
(video, target, _, video_idx) = batch
# move to gpu
video = video.cuda(non_blocking=True)
target = target.cuda(non_blocking=True)
# compute output and loss
output = model(video)
loss = criterion(output.view(video.size(0), -1), target)
# Clip level accuracy
acc1, acc5 = accuracy(output, target, topk=(1, 5))
losses.update(loss.item(), video.size(0))
top1.update(acc1[0], video.size(0))
top5.update(acc5[0], video.size(0))
# measure elapsed time
batch_time.update(time.perf_counter() - end)
end = time.perf_counter()
# Video Level accuracy
for j in range(len(video_idx)):
video_id = video_idx[j].item()
sm = output[j]
label = target[j]
# append it to video dict
softmaxes.setdefault(video_id, []).append(sm)
labels[video_id] = label
# Get video acc@1 and acc@5 and output to tb writer
video_acc1, video_acc5 = aggregrate_video_accuracy(
softmaxes, labels, topk=(1, 5)
)
if args.rank == 0:
logger.info(
"Test:\t"
"Time {batch_time.avg:.3f}\t"
"Loss {loss.avg:.4f}\t"
"ClipAcc@1 {top1.avg:.3f}\t"
"VidAcc@1 {video_acc1:.3f}".format(
batch_time=batch_time, loss=losses, top1=top1,
video_acc1=video_acc1.item()))
writer.add_scalar(
f'{ds}/val/vid_acc1/epoch',
video_acc1.item(),
epoch
)
writer.add_scalar(
f'{ds}/val/vid_acc5/epoch',
video_acc5.item(),
epoch
)
# Log final results to terminal
return losses.avg, video_acc1.item(), video_acc5.item()