in src/evaluation.py [0:0]
def eval_clf_accuracy(self):
"""
Compute the accuracy of flipped attributes according to the trained classifier.
"""
data = self.data
params = self.params
self.ae.eval()
bs = params.batch_size
idx = []
for j in range(len(params.attr)):
attr_index = self.eval_clf.attr.index(params.attr[j])
idx.append(sum([x[1] for x in self.eval_clf.attr[:attr_index]]))
all_preds = [[] for _ in range(params.n_attr)]
for i in range(0, len(data), bs):
# batch / encode / decode
batch_x, batch_y = data.eval_batch(i, i + bs)
enc_outputs = self.ae.encode(batch_x)
# flip all attributes one by one
k = 0
for j, (_, n_cat) in enumerate(params.attr):
for value in range(n_cat):
flipped = flip_attributes(batch_y, params, j, new_value=value)
dec_outputs = self.ae.decode(enc_outputs, flipped)
# classify
clf_preds = self.eval_clf(dec_outputs[-1])[:, idx[j]:idx[j] + n_cat].max(1)[1].view(-1)
all_preds[k].extend((clf_preds.data.cpu() == value).tolist())
k += 1
assert k == params.n_attr
return [np.mean(x) for x in all_preds]