in custom/metrics.py [0:0]
def aggregate_and_normalize(logging_outputs):
agg_output = {}
normalizer = sum(log.get('normalizer', 0) for log in logging_outputs)
if normalizer == 0:
return agg_output
for name in TrainingMetrics.METRIC_NAMES:
# 'mean of medians' special case
if name == 'median_target_rank':
agg_output[name] = np.mean([log[name] for log in logging_outputs if name in log])
continue
metric_sum = sum(log.get(name, 0) for log in logging_outputs)
metric = metric_sum / normalizer
agg_output[name] = metric
# topk and top-p metrics
keys = set()
for log in logging_outputs:
for k in log:
if 'true_topk' in k or 'true_topp' in k or 'true_full_prob' in k or 'repeat_top' in k:
keys.add(k)
for k in keys:
metric_sum = sum(log.get(k, 0) for log in logging_outputs)
metric = metric_sum / normalizer
agg_output[k] = metric
unique_top_keys = set()
for log in logging_outputs:
for k in log:
if 'nextunique' in k:
unique_top_keys.add(k)
for k in unique_top_keys:
unique_list_of_lists = [log.get(k, []) for log in logging_outputs]
unique_flat_list = []
for _sublist in unique_list_of_lists:
unique_flat_list.extend(_sublist)
unique_metric = len(set(unique_flat_list))
agg_output[k] = unique_metric
return agg_output