1
1
import os
2
2
import pickle
3
3
4
- from src .Name .neural . train import TrainCfg , Trainer , acc , Logger , ModelCfg , macro_binary_stats
5
- from src .Name .neural .batching import filter_data , Sampler , Collator
6
- from src .Name .neural .utils .schedules import make_schedule
4
+ from src .Name .nn . training import TrainCfg , Trainer , Logger , ModelCfg
5
+ from src .Name .nn .batching import filter_data , Sampler , Collator
6
+ from src .Name .nn .utils .schedules import make_schedule
7
7
8
8
from torch import device
9
9
from torch .optim import AdamW
10
10
from torch .optim .lr_scheduler import LambdaLR
11
11
12
- from random import seed
12
+ from random import seed , shuffle
13
13
14
14
import sys
15
15
@@ -31,11 +31,11 @@ def train(config: TrainCfg, data_path: str, cast_to: str):
31
31
train_files = [file for file in files if file .file .name in config ['train_files' ]]
32
32
dev_files = [file for file in files if file .file .name in config ['dev_files' ]]
33
33
print (f'Training on { len (train_files )} files with { sum (len (file .hole_asts ) for file in train_files )} holes.' )
34
- print (f'Evaluating on { len (dev_files )} files with { sum (len (file .hole_asts ) for file in train_files )} holes.' )
34
+ print (f'Evaluating on { len (dev_files )} files with { sum (len (file .hole_asts ) for file in dev_files )} holes.' )
35
35
36
36
train_sampler = Sampler (train_files )
37
37
epoch_size = train_sampler .itersize (config ['batch_size_s' ] * config ['backprop_every' ], config ['batch_size_h' ])
38
- collator = Collator (pad_value = - 1 , device = cast_to , allow_self_loops = False )
38
+ collator = Collator (pad_value = - 1 , device = cast_to , allow_self_loops = config [ 'allow_self_loops' ] )
39
39
40
40
model = Trainer (config ['model_config' ]).to (device (cast_to ))
41
41
optimizer = AdamW (params = model .parameters (), lr = 1 , weight_decay = 1e-02 )
@@ -46,7 +46,7 @@ def train(config: TrainCfg, data_path: str, cast_to: str):
46
46
total_steps = config ['num_epochs' ] * epoch_size )
47
47
scheduler = LambdaLR (optimizer = optimizer , lr_lambda = schedule , last_epoch = - 1 )
48
48
49
- best_loss = 1e10
49
+ best_ap = - 1e08
50
50
51
51
for epoch in range (config ['num_epochs' ]):
52
52
print (f'Epoch { epoch } ' )
@@ -58,31 +58,29 @@ def train(config: TrainCfg, data_path: str, cast_to: str):
58
58
optimizer = optimizer ,
59
59
scheduler = scheduler ,
60
60
backprop_every = config ['backprop_every' ])
61
- print (f'Train loss: { sum (train_epoch ["loss" ])/ len (train_epoch ["predictions" ])} ' )
62
- print (f'Train stats: { macro_binary_stats (train_epoch ["predictions" ], train_epoch ["truths" ])} ' )
61
+ print (f'Train loss: { sum (train_epoch .loss )/ len (train_epoch .loss )} ' )
62
+ print (f'Train mAP: { sum (train_epoch .ap )/ len (train_epoch .ap )} ' )
63
+ print (f'Train R-Precision: { sum (train_epoch .rp ) / len (train_epoch .rp )} ' )
63
64
dev_epoch = model .eval_epoch (map (lambda x : collator ([x ]), dev_files ))
64
- print (f'Dev loss: { sum (dev_epoch ["loss" ])/ len (dev_epoch ["predictions" ])} ' )
65
- print (f'Dev stats: { macro_binary_stats (dev_epoch ["predictions" ], dev_epoch ["truths" ])} ' )
66
- print ()
67
-
68
- # if sum(dev_epoch['loss']) < best_loss:
69
- # print('Saving...')
70
- # model.save(f'./model.pt')
71
- # best_loss = sum(dev_epoch['loss'])
72
- # print('=' * 64 + '\n')
65
+ print (f'Dev loss: { sum (dev_epoch .loss )/ len (dev_epoch .loss )} ' )
66
+ print (f'Dev mAP: { sum (dev_epoch .ap ) / len (dev_epoch .ap )} ' )
67
+ print (f'Dev R-Precision: { sum (dev_epoch .rp ) / len (dev_epoch .rp )} ' )
68
+ if sum (dev_epoch .ap ) > best_ap :
69
+ print ('Saving...' )
70
+ model .save (f'./model.pt' )
71
+ best_ap = sum (dev_epoch .ap )
72
+ print ('=' * 64 + '\n ' )
73
73
74
74
75
75
if __name__ == '__main__' :
76
76
seed (42 )
77
- # todo.
77
+
78
78
files = [os .path .splitext (file )[0 ] for file in os .listdir ('../data/stdlib/' )]
79
- # stdlib = [line for line in open('./data/stdlib.contents').read().split('\n')]
80
- # unimath = [line for line in open('./data/um.contents').read().split('\n')]
81
- # typetopo = [line for line in open('./data/tt.contents').read().split('\n')]
82
- # shuffle(stdlib)
79
+ shuffle (files )
80
+ train_files , dev_files = files [:(int (0.75 * len (files )))], files [int (0.75 * len (files )):]
83
81
84
82
model_config : ModelCfg = {
85
- 'depth' : 8 ,
83
+ 'depth' : 6 ,
86
84
'num_heads' : 8 ,
87
85
'dim' : 128 ,
88
86
'atn_dim' : None ,
@@ -94,16 +92,17 @@ def train(config: TrainCfg, data_path: str, cast_to: str):
94
92
'num_epochs' : 99 ,
95
93
'warmup_epochs' : 3 ,
96
94
'warmdown_epochs' : 90 ,
97
- 'batch_size_s' : 1 ,
95
+ 'batch_size_s' : 2 ,
98
96
'batch_size_h' : 8 ,
99
97
'max_lr' : 5e-4 ,
100
98
'min_lr' : 1e-7 ,
101
99
'backprop_every' : 1 ,
102
- 'train_files' : [ f for f in files if f != 'Simple' ] ,
103
- 'dev_files' : [] ,
100
+ 'train_files' : train_files ,
101
+ 'dev_files' : dev_files ,
104
102
'test_files' : [],
105
103
'max_scope_size' : 300 ,
106
104
'max_ast_len' : 100 ,
105
+ 'allow_self_loops' : False
107
106
}
108
107
109
108
train (train_cfg , '../data/tokenized.p' , 'cuda' )
0 commit comments