def _forward(self, inputs, targets, ac_T): outputs = self.model(inputs, ac_T) if isinstance(self.criterion, torch.nn.CrossEntropyLoss): loss = self.criterion(outputs, targets) prec1, prec5 = accuracy(outputs.data, targets.data, topk=(1, 5)) prec1 = prec1[0] prec5 = prec5[0] else: raise ValueError("Unsupported loss:", self.criterion) return loss, prec1, prec5
def validate(val_loader, model, criterion, epoch, writer=None): batch_time = AverageMeter() losses = AverageMeter() top1 = AverageMeter() top5 = AverageMeter() # switch to evaluate mode model.eval() with torch.no_grad(): end = time.time() for i, (input, target) in enumerate(val_loader): target = target.cuda(non_blocking=True) input_var = torch.autograd.Variable(input) target_var = torch.autograd.Variable(target) # compute output output = model(input_var) if isinstance(output, tuple): output, out_aux = output loss = criterion(output, target_var) # measure accuracy and record loss prec1, prec5 = accuracy(output.data, target, topk=(1, 5)) losses.update(loss.data.item(), input.size(0)) top1.update(prec1[0], input.size(0)) top5.update(prec5[0], input.size(0)) # measure elapsed time batch_time.update(time.time() - end) end = time.time() if i % args.print_freq == 0: print('Test: [{0}/{1}]\t' 'Time {batch_time.val:.3f} ({batch_time.avg:.3f})\t' 'Loss {loss.val:.4f} ({loss.avg:.4f})\t' 'Prec@1 {top1.val:.3f} ({top1.avg:.3f})\t' 'Prec@5 {top5.val:.3f} ({top5.avg:.3f})'.format( i, len(val_loader), batch_time=batch_time, loss=losses, top1=top1, top5=top5)) if args.debug and i >= 5: break print(' * Prec@1 {top1.avg:.3f} Prec@5 {top5.avg:.3f}'.format( top1=top1, top5=top5)) if writer is not None: writer.add_scalar("val/cross_entropy", losses.avg, epoch) writer.add_scalar("val/top1", top1.avg.item(), epoch) return top1.avg
def test_knn_classifier(k, weighted, pairs): X = np.random.rand(n_samples, n_dims) y = np.random.randint(0, 2, size=(n_samples,)) X_test = np.random.rand(n_samples, n_dims) y_test = np.random.randint(0, 2, size=(n_samples,)) clf = KNN_Classifier(k, weighted=weighted[0]) clf._distance = lambda a, b: pairs["sk"](a, b) clf.fit(X, y) y_pred = clf.predict(X_test) acc1 = accuracy(y_test, y_pred) clf2 = KNeighborsClassifier(n_neighbors=k, algorithm="brute", weights=weighted[1], metric=pairs["sc"]) clf2.fit(X, y) y_pred2 = clf2.predict(X_test) acc2 = accuracy(y_test, y_pred2) assert acc1 > acc2 or abs(acc1 - acc2) <= 1.2E-1
def validate(model, loader, criterion, device, r): loss_avg = RunningAverage() acc_avg = RunningAverage() model.eval() for i, (frames, labels, centers, meta, _) in enumerate(loader): frames, labels, centers, meta = frames.to(device), labels.to( device), centers.to(device), meta.to(device) outputs = model(frames, centers) if isinstance(criterion, CoordinateLoss): loss = criterion(*outputs, meta, device) acc = coord_accuracy(outputs[1], meta, r=r) else: loss = criterion(outputs, labels) acc = accuracy(outputs, labels, r=r) loss_avg.update(loss.item()) acc_avg.update(acc) return loss_avg(), acc_avg()
def validate(loader, model, criterion, netType, debug, flip): batch_time = AverageMeter() data_time = AverageMeter() losses = AverageMeter() acces = AverageMeter() end = time.time() # predictions predictions = torch.Tensor(loader.dataset.__len__(), 68, 2) model.eval() gt_win, pred_win = None, None bar = Bar('Validating', max=len(loader)) all_dists = torch.zeros((68, loader.dataset.__len__())) for i, (inputs, target, meta) in enumerate(loader): data_time.update(time.time() - end) input_var = torch.autograd.Variable(inputs.cuda()) target_var = torch.autograd.Variable(target.cuda(async=True)) output = model(input_var) score_map = output[-1].data.cpu() if flip: flip_input_var = torch.autograd.Variable( torch.from_numpy(shufflelr( inputs.clone().numpy())).float().cuda()) flip_output_var = model(flip_input_var) flip_output = flip_back(flip_output_var[-1].data.cpu()) score_map += flip_output # intermediate supervision loss = 0 for o in output: loss += criterion(o, target_var) acc, batch_dists = accuracy(score_map, target.cpu(), idx, thr=0.07) all_dists[:, i * args.val_batch:(i + 1) * args.val_batch] = batch_dists preds = final_preds(score_map, meta['center'], meta['scale'], [64, 64]) for n in range(score_map.size(0)): predictions[meta['index'][n], :, :] = preds[n, :, :] if debug: gt_batch_img = batch_with_heatmap(inputs, target) pred_batch_img = batch_with_heatmap(inputs, score_map) if not gt_win or not pred_win: plt.subplot(121) gt_win = plt.imshow(gt_batch_img) plt.subplot(122) pred_win = plt.imshow(pred_batch_img) else: gt_win.set_data(gt_batch_img) pred_win.set_data(pred_batch_img) plt.pause(.05) plt.draw() losses.update(loss.data[0], inputs.size(0)) acces.update(acc[0], inputs.size(0)) batch_time.update(time.time() - end) end = time.time() bar.suffix = '({batch}/{size}) Data: {data:.6f}s | Batch: {bt:.3f}s | Total: {total:} | ETA: {eta:} | Loss: {loss:.4f} | Acc: {acc: .4f}'.format( batch=i + 1, size=len(loader), data=data_time.val, bt=batch_time.val, total=bar.elapsed_td, eta=bar.eta_td, loss=losses.avg, acc=acces.avg) bar.next() bar.finish() mean_error = torch.mean(all_dists) auc = calc_metrics(all_dists) # this is auc of predicted maps and target. print("=> Mean Error: {:.2f}, [email protected]: {} based on maps".format( mean_error * 100., auc)) return losses.avg, acces.avg, predictions, auc
def train(loader, model, criterion, optimizer, netType, debug=False, flip=False): batch_time = AverageMeter() data_time = AverageMeter() losses = AverageMeter() acces = AverageMeter() model.train() end = time.time() # rnn = torch.nn.LSTM(10, 20, 2) # hidden = torch.autograd.Variable(torch.zeros((args.train_batch))) gt_win, pred_win = None, None bar = Bar('Training', max=len(loader)) for i, (inputs, target) in enumerate(loader): data_time.update(time.time() - end) input_var = torch.autograd.Variable(inputs.cuda()) target_var = torch.autograd.Variable(target.cuda(async=True)) if debug: gt_batch_img = batch_with_heatmap(inputs, target) # pred_batch_img = batch_with_heatmap(inputs, score_map) if not gt_win or not pred_win: plt.subplot(121) gt_win = plt.imshow(gt_batch_img) # plt.subplot(122) # pred_win = plt.imshow(pred_batch_img) else: gt_win.set_data(gt_batch_img) # pred_win.set_data(pred_batch_img) plt.pause(.05) plt.draw() output = model(input_var) score_map = output[-1].data.cpu() if flip: flip_input_var = torch.autograd.Variable( torch.from_numpy(shufflelr( inputs.clone().numpy())).float().cuda()) flip_output_var = model(flip_input_var) flip_output = flip_back(flip_output_var[-1].data.cpu()) score_map += flip_output # intermediate supervision loss = 0 for o in output: loss += criterion(o, target_var) acc, _ = accuracy(score_map, target.cpu(), idx, thr=0.07) losses.update(loss.data[0], inputs.size(0)) acces.update(acc[0], inputs.size(0)) optimizer.zero_grad() loss.backward() optimizer.step() batch_time.update(time.time() - end) end = time.time() bar.suffix = '({batch}/{size}) Data: {data:.6f}s | Batch: {bt:.3f}s | Total: {total:} | ETA: {eta:} | Loss: {loss:.4f} | Acc: {acc: .4f}'.format( batch=i + 1, size=len(loader), data=data_time.val, bt=batch_time.val, total=bar.elapsed_td, eta=bar.eta_td, loss=losses.avg, acc=acces.avg) bar.next() bar.finish() return losses.avg, acces.avg
def train(train_loader, model, criterion, optimizer, epoch, writer=None, mask=None): batch_time = AverageMeter() data_time = AverageMeter() losses = AverageMeter() # loss_aux_recorder = AverageMeter() # avg_sparsity_loss = AverageMeter() top1 = AverageMeter() top5 = AverageMeter() # switch to train mode model.train() end = time.time() for i, (input, target) in enumerate(train_loader): adjust_learning_rate(optimizer, epoch, train_loader_len=len(train_loader), iteration=i, decay_strategy=args.lr_strategy, warmup=args.warmup, total_epoch=args.epochs, lr=args.lr, decay_epoch=args.decay_epoch) # measure data loading time data_time.update(time.time() - end) target = target.cuda(non_blocking=True) input_var = torch.autograd.Variable(input) target_var = torch.autograd.Variable(target) # compute output output = model(input_var) if isinstance(output, tuple): output, out_aux = output loss = criterion(output, target_var) # measure accuracy and record loss prec1, prec5 = accuracy(output.data, target, topk=(1, 5)) losses.update(loss.data.item(), input.size(0)) top1.update(prec1[0], input.size(0)) top5.update(prec5[0], input.size(0)) # compute gradient and do SGD step optimizer.zero_grad() loss.backward() # Mask finetuning style: do not actullay prune the network, # just simply disable the updating of the pruned layers if mask is not None: for name, p in model.named_parameters(): if 'weight' in name: p.grad.data = p.grad.data * mask[name] optimizer.step() # measure elapsed time batch_time.update(time.time() - end) end = time.time() if i % args.print_freq == 0: print('Epoch: [{0}][{1}/{2}]\t' 'Time {batch_time.val:.3f} ({batch_time.avg:.3f})\t' 'Data {data_time.val:.3f} ({data_time.avg:.3f})\t' 'Loss {loss.val:.4f} ({loss.avg:.4f})\t' 'lr {3}\t' 'Prec@1 {top1.val:.3f} ({top1.avg:.3f})\t' 'Prec@5 {top5.val:.3f} ({top5.avg:.3f})'.format( epoch, i, len(train_loader), optimizer.param_groups[0]['lr'], batch_time=batch_time, data_time=data_time, loss=losses, top1=top1, top5=top5)) if args.debug and i >= 5: break if writer: writer.add_scalar("train/cross_entropy", losses.avg, epoch) writer.add_scalar("train/top1", top1.avg.item(), epoch) writer.add_scalar("train/top5", top5.avg.item(), epoch)
def validate(loader, model, criterion, netType, debug, flip): batch_time = AverageMeter() data_time = AverageMeter() losses = AverageMeter() acces = AverageMeter() end = time.time() # predictions predictions = torch.Tensor(loader.dataset.__len__(), 68, 2) model.eval() gt_win, pred_win = None, None bar = Bar('Validating', max=len(loader)) all_dists = torch.zeros((68, loader.dataset.__len__())) for i, (inputs, target, meta) in enumerate(loader): data_time.update(time.time() - end) input_var = torch.autograd.Variable(inputs.cuda()) target_var = torch.autograd.Variable(target.cuda(async=True)) output = model(input_var) score_map = output[-1].data.cpu() if flip: flip_input_var = torch.autograd.Variable( torch.from_numpy(shufflelr(inputs.clone().numpy())).float().cuda()) flip_output_var = model(flip_input_var) flip_output = flip_back(flip_output_var[-1].data.cpu()) score_map += flip_output # intermediate supervision loss = 0 for o in output: loss += criterion(o, target_var) acc, batch_dists = accuracy(score_map, target.cpu(), idx, thr=0.07) all_dists[:, i * args.val_batch:(i + 1) * args.val_batch] = batch_dists preds = final_preds(score_map, meta['center'], meta['scale'], [64, 64]) for n in range(score_map.size(0)): predictions[meta['index'][n], :, :] = preds[n, :, :] if debug: gt_batch_img = batch_with_heatmap(inputs, target) pred_batch_img = batch_with_heatmap(inputs, score_map) if not gt_win or not pred_win: plt.subplot(121) gt_win = plt.imshow(gt_batch_img) plt.subplot(122) pred_win = plt.imshow(pred_batch_img) else: gt_win.set_data(gt_batch_img) pred_win.set_data(pred_batch_img) plt.pause(.05) plt.draw() losses.update(loss.data[0], inputs.size(0)) acces.update(acc[0], inputs.size(0)) batch_time.update(time.time() - end) end = time.time() bar.suffix = '({batch}/{size}) Data: {data:.6f}s | Batch: {bt:.3f}s | Total: {total:} | ETA: {eta:} | Loss: {loss:.4f} | Acc: {acc: .4f}'.format( batch=i + 1, size=len(loader), data=data_time.val, bt=batch_time.val, total=bar.elapsed_td, eta=bar.eta_td, loss=losses.avg, acc=acces.avg) bar.next() bar.finish() mean_error = torch.mean(all_dists) auc = calc_metrics(all_dists) # this is auc of predicted maps and target. print("=> Mean Error: {:.2f}, [email protected]: {} based on maps".format(mean_error*100., auc)) return losses.avg, acces.avg, predictions, auc
def train(loader, model, criterion, optimizer, netType, debug=False, flip=False): batch_time = AverageMeter() data_time = AverageMeter() losses = AverageMeter() acces = AverageMeter() model.train() end = time.time() # rnn = torch.nn.LSTM(10, 20, 2) # hidden = torch.autograd.Variable(torch.zeros((args.train_batch))) gt_win, pred_win = None, None bar = Bar('Training', max=len(loader)) for i, (inputs, target) in enumerate(loader): data_time.update(time.time() - end) input_var = torch.autograd.Variable(inputs.cuda()) target_var = torch.autograd.Variable(target.cuda(async=True)) if debug: gt_batch_img = batch_with_heatmap(inputs, target) # pred_batch_img = batch_with_heatmap(inputs, score_map) if not gt_win or not pred_win: plt.subplot(121) gt_win = plt.imshow(gt_batch_img) # plt.subplot(122) # pred_win = plt.imshow(pred_batch_img) else: gt_win.set_data(gt_batch_img) # pred_win.set_data(pred_batch_img) plt.pause(.05) plt.draw() output = model(input_var) score_map = output[-1].data.cpu() if flip: flip_input_var = torch.autograd.Variable( torch.from_numpy(shufflelr(inputs.clone().numpy())).float().cuda()) flip_output_var = model(flip_input_var) flip_output = flip_back(flip_output_var[-1].data.cpu()) score_map += flip_output # intermediate supervision loss = 0 for o in output: loss += criterion(o, target_var) acc, _ = accuracy(score_map, target.cpu(), idx, thr=0.07) losses.update(loss.data[0], inputs.size(0)) acces.update(acc[0], inputs.size(0)) optimizer.zero_grad() loss.backward() optimizer.step() batch_time.update(time.time() - end) end = time.time() bar.suffix = '({batch}/{size}) Data: {data:.6f}s | Batch: {bt:.3f}s | Total: {total:} | ETA: {eta:} | Loss: {loss:.4f} | Acc: {acc: .4f}'.format( batch=i + 1, size=len(loader), data=data_time.val, bt=batch_time.val, total=bar.elapsed_td, eta=bar.eta_td, loss=losses.avg, acc=acces.avg) bar.next() bar.finish() return losses.avg, acces.avg
def train(model, loader, criterion, optimizer, device, r, scheduler=None, clip=None, summary=None, debug=False): loss_avg = RunningAverage() acc_avg = RunningAverage() time_avg = RunningAverage() model.train() with tqdm(total=len(loader)) as t: for i, (frames, labels, centers, meta, unnormalized) in enumerate(loader): frames, labels, centers, meta = frames.to(device), labels.to( device), centers.to(device), meta.to(device) if debug: debug_inputs(unnormalized, labels, centers) start = time.time() outputs = model(frames, centers) time_avg.update(time.time() - start) if debug: debug_predictions(unnormalized, labels, outputs) if isinstance(criterion, CoordinateLoss): loss = criterion(*outputs, meta, device) acc = coord_accuracy(outputs[1], meta, r=r) else: loss = criterion(outputs, labels) acc = accuracy(outputs, labels, r=r) optimizer.zero_grad() loss.backward() if clip is not None: utils.clip_grad_norm_(model.parameters(), clip) optimizer.step() if scheduler is not None: scheduler.step() loss_avg.update(loss.item()) acc_avg.update(acc) if summary is not None: summary.add_scalar_value('Train Accuracy', acc) summary.add_scalar_value('Train Loss', loss.item()) t.set_postfix(loss='{:05.3f}'.format(loss.item()), acc='{:05.3f}%'.format(acc * 100), loss_avg='{:05.3f}'.format(loss_avg()), acc_avg='{:05.3f}%'.format(acc_avg() * 100), time_avg='{}ms'.format(int(1000 * time_avg()))) t.update() return loss_avg(), acc_avg()
def test_accuracy(): res = accuracy(preds, y) assert res == 1 / 3