4
4
from __future__ import division
5
5
from __future__ import print_function
6
6
7
- import torch
8
- from torch .autograd import Variable
9
- import torch .optim as optim
10
7
import numpy as np
11
-
8
+ import pandas as pd
12
9
from six .moves import cPickle
10
+ import time ,os ,random
11
+ import itertools
13
12
14
- import opts
15
- import models
13
+ import torch
14
+ from torch .autograd import Variable
15
+ import torch .optim as optim
16
16
import torch .nn as nn
17
- import utils
18
17
import torch .nn .functional as F
19
- from torchtext import data
20
- from torchtext import datasets
21
- from torchtext .vocab import Vectors , GloVe , CharNGram , FastText
22
18
from torch .nn .modules .loss import NLLLoss ,MultiLabelSoftMarginLoss ,MultiLabelMarginLoss ,BCELoss
23
- import dataHelper
24
- import time ,os
25
-
26
-
27
- from_torchtext = False
28
-
29
- opt = opts .parse_opt ()
30
- #opt.proxy="http://xxxx.xxxx.com:8080"
31
-
32
-
33
- if "CUDA_VISIBLE_DEVICES" not in os .environ .keys ():
34
- os .environ ["CUDA_VISIBLE_DEVICES" ] = opt .gpu
35
- #opt.model ='lstm'
36
- #opt.model ='capsule'
37
19
38
- if from_torchtext :
39
- train_iter , test_iter = utils .loadData (opt )
40
- else :
41
- import dataHelper as helper
42
- train_iter , test_iter = dataHelper .loadData (opt )
43
-
44
- opt .lstm_layers = 2
45
-
46
- model = models .setup (opt )
47
- if torch .cuda .is_available ():
48
- model .cuda ()
49
- model .train ()
50
- print ("# parameters:" , sum (param .numel () for param in model .parameters () if param .requires_grad ))
51
- optimizer = optim .Adam (filter (lambda p : p .requires_grad , model .parameters ()), lr = opt .learning_rate )
52
- optimizer .zero_grad ()
53
- loss_fun = F .cross_entropy
54
-
55
- #batch = next(iter(train_iter))
56
-
57
- #x=batch.text[0]
58
-
59
- #x=batch.text[0] #64x200
60
-
61
- #print(utils.evaluation(model,test_iter))
62
- for i in range (opt .max_epoch ):
63
- for epoch ,batch in enumerate (train_iter ):
64
- start = time .time ()
65
-
66
- text = batch .text [0 ] if from_torchtext else batch .text
67
- predicted = model (text )
20
+ import opts
21
+ import models
22
+ import utils
68
23
69
- loss = loss_fun (predicted ,batch .label )
70
24
71
- loss .backward ()
72
- utils .clip_gradient (optimizer , opt .grad_clip )
73
- optimizer .step ()
74
- if epoch % 100 == 0 :
75
- if torch .cuda .is_available ():
76
- print ("%d iteration %d epoch with loss : %.5f in %.4f seconds" % (i ,epoch ,loss .cpu ().item (),time .time ()- start ))
77
- else :
78
- print ("%d iteration %d epoch with loss : %.5f in %.4f seconds" % (i ,epoch ,loss .data .numpy ()[0 ],time .time ()- start ))
25
+ timeStamp = time .strftime ("%Y%m%d%H%M%S" , time .localtime (int (time .time ()) ))
26
+ performance_log_file = os .path .join ("log" ,"result" + timeStamp + ".csv" )
27
+ if not os .path .exists (performance_log_file ):
28
+ with open (performance_log_file ,"w" ) as f :
29
+ f .write ("argument\n " )
30
+ f .close ()
31
+
32
+
33
+ def train (opt ,train_iter , test_iter ,verbose = True ):
34
+ global_start = time .time ()
35
+ logger = utils .getLogger ()
36
+ model = models .setup (opt )
37
+ if torch .cuda .is_available ():
38
+ model .cuda ()
39
+ params = [param for param in model .parameters () if param .requires_grad ] #filter(lambda p: p.requires_grad, model.parameters())
40
+
41
+ model_info = ";" .join ( [str (k )+ ":" + str (v ) for k ,v in opt .__dict__ .items () if type (v ) in (str ,int ,float ,list ,bool )])
42
+ logger .info ("# parameters:" + str (sum (param .numel () for param in params )))
43
+ logger .info (model_info )
44
+
45
+
46
+ model .train ()
47
+ optimizer = utils .getOptimizer (params ,name = opt .optimizer , lr = opt .learning_rate ,scheduler = utils .get_lr_scheduler (opt .lr_scheduler ))
48
+ optimizer .zero_grad ()
49
+ loss_fun = F .cross_entropy
50
+
51
+ filename = None
52
+ percisions = []
53
+ for i in range (opt .max_epoch ):
54
+ for epoch ,batch in enumerate (train_iter ):
55
+ start = time .time ()
56
+
57
+ text = batch .text [0 ] if opt .from_torchtext else batch .text
58
+ predicted = model (text )
59
+
60
+ loss = loss_fun (predicted ,batch .label )
61
+
62
+ loss .backward ()
63
+ utils .clip_gradient (optimizer , opt .grad_clip )
64
+ optimizer .step ()
65
+
66
+ if verbose :
67
+ if torch .cuda .is_available ():
68
+ logger .info ("%d iteration %d epoch with loss : %.5f in %.4f seconds" % (i ,epoch ,loss .cpu ().data .numpy (),time .time ()- start ))
69
+ else :
70
+ logger .info ("%d iteration %d epoch with loss : %.5f in %.4f seconds" % (i ,epoch ,loss .data .numpy ()[0 ],time .time ()- start ))
79
71
80
- percision = utils .evaluation (model ,test_iter ,from_torchtext )
81
- print ("%d iteration with percision %.4f" % (i ,percision ))
82
-
83
-
72
+ percision = utils .evaluation (model ,test_iter ,opt .from_torchtext )
73
+ if verbose :
74
+ logger .info ("%d iteration with percision %.4f" % (i ,percision ))
75
+ if len (percisions )== 0 or percision > max (percisions ):
76
+ if filename :
77
+ os .remove (filename )
78
+ filename = model .save (metric = percision )
79
+ percisions .append (percision )
80
+
81
+ # while(utils.is_writeable(performance_log_file)):
82
+ df = pd .read_csv (performance_log_file ,index_col = 0 ,sep = "\t " )
83
+ df .loc [model_info ,opt .dataset ] = max (percisions )
84
+ df .to_csv (performance_log_file ,sep = "\t " )
85
+ logger .info (model_info + " with time :" + str ( time .time ()- global_start )+ " ->" + str ( max (percisions ) ) )
86
+ print (model_info + " with time :" + str ( time .time ()- global_start )+ " ->" + str ( max (percisions ) ) )
87
+
88
+ def main ():
89
+ from_torchtext = False
90
+ if "CUDA_VISIBLE_DEVICES" not in os .environ .keys ():
91
+ os .environ ["CUDA_VISIBLE_DEVICES" ] = opt .gpu
92
+ #opt.model ='lstm'
93
+ #opt.model ='capsule'
94
+ if from_torchtext :
95
+ train_iter , test_iter = utils .loadData (opt )
96
+ else :
97
+ import dataHelper
98
+ train_iter , test_iter = dataHelper .loadData (opt )
99
+
100
+ model = models .setup (opt )
101
+ print (opt .model )
102
+ if torch .cuda .is_available ():
103
+ model .cuda ()
104
+
105
+
106
+
107
+ train (opt ,train_iter , test_iter )
108
+
109
+ if __name__ == "__main__" :
110
+ parameter_pools = utils .parse_grid_parameters ("config/grid_search_cnn.ini" )
111
+
112
+ # parameter_pools={
113
+ # "model":["lstm","cnn","fasttext"],
114
+ # "keep_dropout":[0.8,0.9,1.0],
115
+ # "batch_size":[32,64,128],
116
+ # "learning_rate":[100,10,1,1e-1,1e-2,1e-3],
117
+ # "optimizer":["adam"],
118
+ # "lr_scheduler":[None]
119
+ # }
120
+ opt = opts .parse_opt ()
121
+ if "CUDA_VISIBLE_DEVICES" not in os .environ .keys ():
122
+ os .environ ["CUDA_VISIBLE_DEVICES" ] = opt .gpu
123
+ train_iter , test_iter = utils .loadData (opt )
124
+ # if from_torchtext:
125
+ # train_iter, test_iter = utils.loadData(opt)
126
+ # else:
127
+ # import dataHelper
128
+ # train_iter, test_iter = dataHelper.loadData(opt)
129
+ if False :
130
+ model = models .setup (opt )
131
+ print (opt .model )
132
+ if torch .cuda .is_available ():
133
+ model .cuda ()
134
+ train (opt ,train_iter , test_iter )
135
+ else :
136
+
137
+ pool = [ arg for arg in itertools .product (* parameter_pools .values ())]
138
+ random .shuffle (pool )
139
+ args = [arg for i ,arg in enumerate (pool ) if i % opt .gpu_num == opt .gpu ]
140
+
141
+ for arg in args :
142
+ olddataset = opt .dataset
143
+ for k ,v in zip (parameter_pools .keys (),arg ):
144
+ opt .__setattr__ (k ,v )
145
+ if "dataset" in parameter_pools and olddataset != opt .dataset :
146
+ train_iter , test_iter = utils .loadData (opt )
147
+ train (opt ,train_iter , test_iter ,verbose = False )
148
+
0 commit comments