17
17
from keras import backend as K
18
18
from keras import metrics
19
19
from keras .models import Sequential
20
- from keras .layers import Dense , Dropout
20
+ from keras .layers import Dense , Dropout , LocallyConnected1D , MaxPooling1D , Flatten
21
21
from keras .callbacks import Callback , ModelCheckpoint , ProgbarLogger
22
22
23
23
from sklearn .preprocessing import Imputer
64
64
D4 = 50
65
65
DENSE_LAYERS = [D1 , D2 , D3 , D4 ]
66
66
67
+ # Number of units per locally connected layer
68
+ LC1 = 10 , 1 # nb_filter, filter_length
69
+ LC2 = 0 , 0 # disabled layer
70
+ # LOCALLY_CONNECTED_LAYERS = list(LC1 + LC2)
71
+ LOCALLY_CONNECTED_LAYERS = [0 , 0 ]
72
+ POOL = 100
73
+
67
74
MIN_LOGCONC = - 5.
68
75
MAX_LOGCONC = - 4.
69
76
@@ -90,6 +97,9 @@ def get_parser():
90
97
parser .add_argument ("-e" , "--epochs" , action = "store" ,
91
98
default = NB_EPOCH , type = int ,
92
99
help = "number of training epochs" )
100
+ parser .add_argument ("-l" , "--locally_connected" , action = "store" , nargs = '+' , type = int ,
101
+ default = LOCALLY_CONNECTED_LAYERS ,
102
+ help = "integer array describing locally connected layers: layer1_nb_filter, layer1_filter_len, layer2_nb_filter, layer2_filter_len, ..." )
93
103
parser .add_argument ("-o" , "--optimizer" , action = "store" ,
94
104
default = OPTIMIZER ,
95
105
help = "keras optimizer to use: sgd, rmsprop, ..." )
@@ -99,6 +109,9 @@ def get_parser():
99
109
parser .add_argument ("--loss" , action = "store" ,
100
110
default = LOSS ,
101
111
help = "keras loss function to use: mse, ..." )
112
+ parser .add_argument ("--pool" , action = "store" ,
113
+ default = POOL , type = int ,
114
+ help = "pooling layer length" )
102
115
parser .add_argument ("--scaling" , action = "store" ,
103
116
default = SCALING ,
104
117
help = "type of feature scaling; 'minabs': to [-1,1]; 'minmax': to [0,1], 'std': standard unit normalization; None: no normalization" )
@@ -147,6 +160,16 @@ def extension_from_parameters(args):
147
160
ext += '.E={}' .format (args .epochs )
148
161
if args .feature_subsample :
149
162
ext += '.F={}' .format (args .feature_subsample )
163
+ if args .locally_connected :
164
+ layer_list = list (range (0 , len (args .locally_connected ), 2 ))
165
+ for l , i in enumerate (layer_list ):
166
+ nb_filter = args .locally_connected [i ]
167
+ filter_len = args .locally_connected [i + 1 ]
168
+ if nb_filter <= 0 or filter_len <= 0 :
169
+ break
170
+ ext += '.LC{}={},{}' .format (l + 1 , nb_filter , filter_len )
171
+ if args .pool and layer_list [0 ] and layer_list [1 ]:
172
+ ext += '.P={}' .format (args .pool )
150
173
for i , n in enumerate (args .dense ):
151
174
if n :
152
175
ext += '.D{}={}' .format (i + 1 , n )
@@ -289,13 +312,23 @@ def main():
289
312
subsample = args .subsample ,
290
313
category_cutoffs = args .category_cutoffs )
291
314
292
- train_gen = datagen .flow (batch_size = args .batch_size )
293
- val_gen = datagen .flow (data = 'val' , batch_size = args .batch_size )
294
- val_gen2 = datagen .flow (data = 'val' , batch_size = args .batch_size )
295
- test_gen = datagen .flow (data = 'test' , batch_size = args .batch_size )
296
-
315
+ topology = 'dense'
297
316
out_dim = 1
317
+
298
318
model = Sequential ()
319
+ if args .locally_connected and args .locally_connected [0 ]:
320
+ topology = 'simple_local'
321
+ layer_list = list (range (0 , len (args .locally_connected ), 2 ))
322
+ for l , i in enumerate (layer_list ):
323
+ nb_filter = args .locally_connected [i ]
324
+ filter_len = args .locally_connected [i + 1 ]
325
+ if nb_filter <= 0 or filter_len <= 0 :
326
+ break
327
+ model .add (LocallyConnected1D (nb_filter , filter_len , input_shape = (datagen .input_dim , 1 ), activation = args .activation ))
328
+ if args .pool :
329
+ model .add (MaxPooling1D (pool_length = args .pool ))
330
+ model .add (Flatten ())
331
+
299
332
for layer in args .dense :
300
333
if layer :
301
334
model .add (Dense (layer , input_dim = datagen .input_dim , activation = args .activation ))
@@ -306,6 +339,11 @@ def main():
306
339
model .summary ()
307
340
model .compile (loss = args .loss , optimizer = args .optimizer )
308
341
342
+ train_gen = datagen .flow (batch_size = args .batch_size , topology = topology )
343
+ val_gen = datagen .flow (data = 'val' , batch_size = args .batch_size , topology = topology )
344
+ val_gen2 = datagen .flow (data = 'val' , batch_size = args .batch_size , topology = topology )
345
+ test_gen = datagen .flow (data = 'test' , batch_size = args .batch_size , topology = topology )
346
+
309
347
train_samples = int (datagen .n_train / args .batch_size ) * args .batch_size
310
348
val_samples = int (datagen .n_val / args .batch_size ) * args .batch_size
311
349
test_samples = int (datagen .n_test / args .batch_size ) * args .batch_size
0 commit comments