in src/evaluation/evaluator.py [0:0]
def dist_mean_cosine(self, to_log):
"""
Mean-cosine model selection criterion.
"""
# get normalized embeddings
src_emb = self.mapping(self.src_emb.weight).data
tgt_emb = self.tgt_emb.weight.data
src_emb = src_emb / src_emb.norm(2, 1, keepdim=True).expand_as(src_emb)
tgt_emb = tgt_emb / tgt_emb.norm(2, 1, keepdim=True).expand_as(tgt_emb)
# build dictionary
for dico_method in ['nn', 'csls_knn_10']:
dico_build = 'S2T'
dico_max_size = 10000
# temp params / dictionary generation
_params = deepcopy(self.params)
_params.dico_method = dico_method
_params.dico_build = dico_build
_params.dico_threshold = 0
_params.dico_max_rank = 10000
_params.dico_min_size = 0
_params.dico_max_size = dico_max_size
s2t_candidates = get_candidates(src_emb, tgt_emb, _params)
t2s_candidates = get_candidates(tgt_emb, src_emb, _params)
dico = build_dictionary(src_emb, tgt_emb, _params, s2t_candidates, t2s_candidates)
# mean cosine
if dico is None:
mean_cosine = -1e9
else:
mean_cosine = (src_emb[dico[:dico_max_size, 0]] * tgt_emb[dico[:dico_max_size, 1]]).sum(1).mean()
mean_cosine = mean_cosine.item() if isinstance(mean_cosine, torch_tensor) else mean_cosine
logger.info("Mean cosine (%s method, %s build, %i max size): %.5f"
% (dico_method, _params.dico_build, dico_max_size, mean_cosine))
to_log['mean_cosine-%s-%s-%i' % (dico_method, _params.dico_build, dico_max_size)] = mean_cosine