comparison keras_deep_learning.py @ 2:38c4f8a98038 draft

"planemo upload for repository https://github.com/bgruening/galaxytools/tree/master/tools/sklearn commit 5b2ac730ec6d3b762faa9034eddd19ad1b347476"
author bgruening
date Mon, 16 Dec 2019 10:07:37 +0000
parents c1b0c8232816
children 0a1812986bc3
comparison
equal deleted inserted replaced
1:c1b0c8232816 2:38c4f8a98038
6 import six 6 import six
7 import warnings 7 import warnings
8 8
9 from ast import literal_eval 9 from ast import literal_eval
10 from keras.models import Sequential, Model 10 from keras.models import Sequential, Model
11 from galaxy_ml.utils import try_get_attr, get_search_params 11 from galaxy_ml.utils import try_get_attr, get_search_params, SafeEval
12
13
14 safe_eval = SafeEval()
12 15
13 16
14 def _handle_shape(literal): 17 def _handle_shape(literal):
15 """Eval integer or list/tuple of integers from string 18 """Eval integer or list/tuple of integers from string
16 19
68 "constraint_type": 71 "constraint_type":
69 "MinMaxNorm" 72 "MinMaxNorm"
70 } 73 }
71 """ 74 """
72 constraint_type = config['constraint_type'] 75 constraint_type = config['constraint_type']
73 if constraint_type == 'None': 76 if constraint_type in ('None', ''):
74 return None 77 return None
75 78
76 klass = getattr(keras.constraints, constraint_type) 79 klass = getattr(keras.constraints, constraint_type)
77 options = config.get('constraint_options', {}) 80 options = config.get('constraint_options', {})
78 if 'axis' in options: 81 if 'axis' in options:
87 90
88 def _handle_layer_parameters(params): 91 def _handle_layer_parameters(params):
89 """Access to handle all kinds of parameters 92 """Access to handle all kinds of parameters
90 """ 93 """
91 for key, value in six.iteritems(params): 94 for key, value in six.iteritems(params):
92 if value == 'None': 95 if value in ('None', ''):
93 params[key] = None 96 params[key] = None
94 continue 97 continue
95 98
96 if type(value) in [int, float, bool]\ 99 if type(value) in [int, float, bool]\
97 or (type(value) is str and value.isalpha()): 100 or (type(value) is str and value.isalpha()):
98 continue 101 continue
99 102
100 if key in ['input_shape', 'noise_shape', 'shape', 'batch_shape', 103 if key in ['input_shape', 'noise_shape', 'shape', 'batch_shape',
101 'target_shape', 'dims', 'kernel_size', 'strides', 104 'target_shape', 'dims', 'kernel_size', 'strides',
102 'dilation_rate', 'output_padding', 'cropping', 'size', 105 'dilation_rate', 'output_padding', 'cropping', 'size',
103 'padding', 'pool_size', 'axis', 'shared_axes']: 106 'padding', 'pool_size', 'axis', 'shared_axes'] \
107 and isinstance(value, str):
104 params[key] = _handle_shape(value) 108 params[key] = _handle_shape(value)
105 109
106 elif key.endswith('_regularizer'): 110 elif key.endswith('_regularizer') and isinstance(value, dict):
107 params[key] = _handle_regularizer(value) 111 params[key] = _handle_regularizer(value)
108 112
109 elif key.endswith('_constraint'): 113 elif key.endswith('_constraint') and isinstance(value, dict):
110 params[key] = _handle_constraint(value) 114 params[key] = _handle_constraint(value)
111 115
112 elif key == 'function': # No support for lambda/function eval 116 elif key == 'function': # No support for lambda/function eval
113 params.pop(key) 117 params.pop(key)
114 118
127 layers = config['layers'] 131 layers = config['layers']
128 for layer in layers: 132 for layer in layers:
129 options = layer['layer_selection'] 133 options = layer['layer_selection']
130 layer_type = options.pop('layer_type') 134 layer_type = options.pop('layer_type')
131 klass = getattr(keras.layers, layer_type) 135 klass = getattr(keras.layers, layer_type)
132 other_options = options.pop('layer_options', {}) 136 kwargs = options.pop('kwargs', '')
133 options.update(other_options)
134 137
135 # parameters needs special care 138 # parameters needs special care
136 options = _handle_layer_parameters(options) 139 options = _handle_layer_parameters(options)
140
141 if kwargs:
142 kwargs = safe_eval('dict(' + kwargs + ')')
143 options.update(kwargs)
137 144
138 # add input_shape to the first layer only 145 # add input_shape to the first layer only
139 if not getattr(model, '_layers') and input_shape is not None: 146 if not getattr(model, '_layers') and input_shape is not None:
140 options['input_shape'] = input_shape 147 options['input_shape'] = input_shape
141 148
156 for layer in layers: 163 for layer in layers:
157 options = layer['layer_selection'] 164 options = layer['layer_selection']
158 layer_type = options.pop('layer_type') 165 layer_type = options.pop('layer_type')
159 klass = getattr(keras.layers, layer_type) 166 klass = getattr(keras.layers, layer_type)
160 inbound_nodes = options.pop('inbound_nodes', None) 167 inbound_nodes = options.pop('inbound_nodes', None)
161 other_options = options.pop('layer_options', {}) 168 kwargs = options.pop('kwargs', '')
162 options.update(other_options)
163 169
164 # parameters needs special care 170 # parameters needs special care
165 options = _handle_layer_parameters(options) 171 options = _handle_layer_parameters(options)
172
173 if kwargs:
174 kwargs = safe_eval('dict(' + kwargs + ')')
175 options.update(kwargs)
176
166 # merge layers 177 # merge layers
167 if 'merging_layers' in options: 178 if 'merging_layers' in options:
168 idxs = literal_eval(options.pop('merging_layers')) 179 idxs = literal_eval(options.pop('merging_layers'))
169 merging_layers = [all_layers[i-1] for i in idxs] 180 merging_layers = [all_layers[i-1] for i in idxs]
170 new_layer = klass(**options)(merging_layers) 181 new_layer = klass(**options)(merging_layers)
192 Parameters 203 Parameters
193 ----------- 204 -----------
194 config : dictionary, galaxy tool parameters loaded by JSON 205 config : dictionary, galaxy tool parameters loaded by JSON
195 """ 206 """
196 generator_type = config.pop('generator_type') 207 generator_type = config.pop('generator_type')
208 if generator_type == 'none':
209 return None
210
197 klass = try_get_attr('galaxy_ml.preprocessors', generator_type) 211 klass = try_get_attr('galaxy_ml.preprocessors', generator_type)
198 212
199 if generator_type == 'GenomicIntervalBatchGenerator': 213 if generator_type == 'GenomicIntervalBatchGenerator':
200 config['ref_genome_path'] = 'to_be_determined' 214 config['ref_genome_path'] = 'to_be_determined'
201 config['intervals_path'] = 'to_be_determined' 215 config['intervals_path'] = 'to_be_determined'
227 model = get_functional_model(layers_config) 241 model = get_functional_model(layers_config)
228 242
229 json_string = model.to_json() 243 json_string = model.to_json()
230 244
231 with open(outfile, 'w') as f: 245 with open(outfile, 'w') as f:
232 f.write(json_string) 246 json.dump(json.loads(json_string), f, indent=2)
233 247
234 248
235 def build_keras_model(inputs, outfile, model_json, infile_weights=None, 249 def build_keras_model(inputs, outfile, model_json, infile_weights=None,
236 batch_mode=False, outfile_params=None): 250 batch_mode=False, outfile_params=None):
237 """ for `keras_model_builder` tool 251 """ for `keras_model_builder` tool