-
Notifications
You must be signed in to change notification settings - Fork 2
/
Copy pathxtrack_parse_log.py
103 lines (77 loc) · 2.92 KB
/
xtrack_parse_log.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
from collections import defaultdict
import re
def parse(ln, part=1):
return ln.rsplit(' ', 2)[part]
def parse_col(ln):
return ln[59:69].strip()
def remove_multiple_spaces(ln):
return re.sub(' +', ' ', ln)
def parse_valid_type(ln):
ln = remove_multiple_spaces(ln)
return ln.rsplit(' ', 3)[1].replace(':', '')
def parse_param(ln):
param, val = ln[43:].strip().split(': ')
return param, val
def parse_n_params(ln):
return int(ln.split('has')[1].split('parameters')[0].strip())
def add_best_stats_to_row(best_acc, best_epoch, best_param_file, row):
for stat in best_acc:
row['a_best_acc_%s' % stat] = best_acc[stat]
row['b_best_epoch_%s' % stat] = best_epoch[stat]
row['p_%s' % stat] = best_param_file[stat]
def main(log_file, print_header, sep_chr, only_best_params):
best_acc = defaultdict(float)
best_epoch = defaultdict(lambda: -1)
best_param_file = {}
epoch = -1
row = {}
with open(log_file) as f_in:
f_lines = iter(f_in)
acc = defaultdict(float)
param_file = None
while True:
try:
ln = next(f_lines)
ln = ln.strip()
except StopIteration:
break
if 'This model has' in ln:
row['c_nparams'] = parse_n_params(ln)
if 'Epoch' in ln:
epoch = int(parse_col(ln))
elif 'Saving parameters' in ln:
param_file = parse(ln, part=-1)
elif 'Valid tracking acc' in ln:
acc['goals'] = float(parse_col(ln))
elif 'Valid acc' in ln:
valid_type = parse_valid_type(ln)
acc[valid_type] = float(parse(ln))
elif 'Effective args' in ln:
while not 'Experiment path' in ln:
ln = next(f_lines)
param, val = parse_param(ln)
row[param] = val
elif 'Example' in ln:
for acc_type in acc:
if acc[acc_type] > best_acc[acc_type]:
best_acc[acc_type] = acc[acc_type]
best_epoch[acc_type] = epoch
best_param_file[acc_type] = param_file
if not only_best_params:
add_best_stats_to_row(best_acc, best_epoch, best_param_file, row)
keys = sorted(row.keys())
if print_header:
print sep_chr.join(keys)
print sep_chr.join(str(row[key]) for key in keys)
else:
print best_param_file['goals']
if __name__ == '__main__':
import argparse
parser = argparse.ArgumentParser()
parser.add_argument('log_file')
parser.add_argument('--print_header', default=False, action='store_true')
parser.add_argument('--sep_chr', default='\t')
parser.add_argument('--only_best_params', default=False,
action='store_true')
args = parser.parse_args()
main(**vars(args))