in train_modular.py [0:0]
def test(epoch):
model.eval()
accuracies = []
all_attr_lab = []
all_obj_lab = []
all_pred = []
pairs = valloader.dataset.pairs
objs = valloader.dataset.objs
attrs = valloader.dataset.attrs
if args.test_set == 'test':
val_pairs = valloader.dataset.test_pairs
else:
val_pairs = valloader.dataset.val_pairs
train_pairs = valloader.dataset.train_pairs
for idx, data in enumerate(valloader):
data = [d.cuda() for d in data]
attr_truth, obj_truth = data[1], data[2]
_, _, _, predictions = model(data)
predictions, feats = predictions
all_pred.append(predictions)
all_attr_lab.append(attr_truth)
all_obj_lab.append(obj_truth)
if idx % 100 == 0:
print('Tested {}/{}'.format(idx, len(valloader)))
all_attr_lab = torch.cat(all_attr_lab)
all_obj_lab = torch.cat(all_obj_lab)
all_pair_lab = [
val_pairs.index((attrs[all_attr_lab[i]], objs[all_obj_lab[i]]))
for i in range(len(all_attr_lab))
]
all_pred_dict = {}
for k in all_pred[0].keys():
all_pred_dict[k] = torch.cat(
[all_pred[i][k] for i in range(len(all_pred))])
all_accuracies = []
# Calculate best unseen acc
# put everything on cpu
attr_truth, obj_truth = all_attr_lab.cpu(), all_obj_lab.cpu()
pairs = list(
zip(list(attr_truth.cpu().numpy()), list(obj_truth.cpu().numpy())))
seen_ind = torch.LongTensor([
i for i in range(len(attr_truth))
if pairs[i] in evaluator_val.train_pairs
])
unseen_ind = torch.LongTensor([
i for i in range(len(attr_truth))
if pairs[i] not in evaluator_val.train_pairs
])
accuracies = []
bias = 1e3
args.bias = bias
results = evaluator_val.score_model(
all_pred_dict, all_obj_lab, bias=args.bias)
match_stats = evaluator_val.evaluate_predictions(results, all_attr_lab,
all_obj_lab)
accuracies.append(match_stats)
meanAP = 0
_, _, _, _, _, _, open_unseen_match = match_stats
accuracies = zip(*accuracies)
open_unseen_match = open_unseen_match.byte()
accuracies = list(map(torch.mean, map(torch.cat, accuracies)))
attr_acc, obj_acc, closed_acc, open_acc, objoracle_acc, open_seen_acc, open_unseen_acc = accuracies
max_seen_scores = results['scores'][
unseen_ind][:, evaluator_val.seen_mask].max(1)[0]
max_unseen_scores = results['scores'][
unseen_ind][:, 1 - evaluator_val.seen_mask].max(1)[0]
unseen_score_diff = max_seen_scores - max_unseen_scores
correct_unseen_score_diff = unseen_score_diff[open_unseen_match] - 1e-4
full_unseen_acc = [(
epoch,
attr_acc,
obj_acc,
closed_acc,
open_acc,
(open_seen_acc * open_unseen_acc)**0.5,
0.5 * (open_seen_acc + open_unseen_acc),
open_seen_acc,
open_unseen_acc,
objoracle_acc,
meanAP,
bias,
)]
print(
'(val) E: %d | A: %.3f | O: %.3f | Cl: %.3f | Op: %.4f | OpHM: %.4f | OpAvg: %.4f | OpSeen: %.4f | OpUnseen: %.4f | OrO: %.4f | maP: %.4f | bias: %.3f'
% (
epoch,
attr_acc,
obj_acc,
closed_acc,
open_acc,
(open_seen_acc * open_unseen_acc)**0.5,
0.5 * (open_seen_acc + open_unseen_acc),
open_seen_acc,
open_unseen_acc,
objoracle_acc,
meanAP,
bias,
))
return all_accuracies