Mercurial > repos > bgruening > sklearn_estimator_attributes
diff keras_deep_learning.py @ 17:a01fa4e8fe4f draft
planemo upload for repository https://github.com/bgruening/galaxytools/tree/master/tools/sklearn commit 9981e25b00de29ed881b2229a173a8c812ded9bb
author | bgruening |
---|---|
date | Wed, 09 Aug 2023 12:54:40 +0000 |
parents | c9ddd20d25d0 |
children |
line wrap: on
line diff
--- a/keras_deep_learning.py Thu Aug 11 09:52:07 2022 +0000 +++ b/keras_deep_learning.py Wed Aug 09 12:54:40 2023 +0000 @@ -1,21 +1,19 @@ import argparse import json -import pickle import warnings from ast import literal_eval -import keras -import pandas as pd import six -from galaxy_ml.utils import get_search_params, SafeEval, try_get_attr -from keras.models import Model, Sequential +from galaxy_ml.model_persist import dump_model_to_h5 +from galaxy_ml.utils import SafeEval, try_get_attr +from tensorflow import keras +from tensorflow.keras.models import Model, Sequential safe_eval = SafeEval() def _handle_shape(literal): - """ - Eval integer or list/tuple of integers from string + """Eval integer or list/tuple of integers from string Parameters: ----------- @@ -32,8 +30,7 @@ def _handle_regularizer(literal): - """ - Construct regularizer from string literal + """Construct regularizer from string literal Parameters ---------- @@ -57,8 +54,7 @@ def _handle_constraint(config): - """ - Construct constraint from galaxy tool parameters. + """Construct constraint from galaxy tool parameters. Suppose correct dictionary format Parameters @@ -91,9 +87,7 @@ def _handle_layer_parameters(params): - """ - Access to handle all kinds of parameters - """ + """Access to handle all kinds of parameters""" for key, value in six.iteritems(params): if value in ("None", ""): params[key] = None @@ -104,28 +98,24 @@ ): continue - if ( - key - in [ - "input_shape", - "noise_shape", - "shape", - "batch_shape", - "target_shape", - "dims", - "kernel_size", - "strides", - "dilation_rate", - "output_padding", - "cropping", - "size", - "padding", - "pool_size", - "axis", - "shared_axes", - ] - and isinstance(value, str) - ): + if key in [ + "input_shape", + "noise_shape", + "shape", + "batch_shape", + "target_shape", + "dims", + "kernel_size", + "strides", + "dilation_rate", + "output_padding", + "cropping", + "size", + "padding", + "pool_size", + "axis", + "shared_axes", + ] and isinstance(value, str): params[key] = _handle_shape(value) elif key.endswith("_regularizer") and isinstance(value, dict): @@ -141,8 +131,7 @@ def get_sequential_model(config): - """ - Construct keras Sequential model from Galaxy tool parameters + """Construct keras Sequential model from Galaxy tool parameters Parameters: ----------- @@ -165,7 +154,7 @@ options.update(kwargs) # add input_shape to the first layer only - if not getattr(model, "_layers") and input_shape is not None: + if not model.get_config()["layers"] and input_shape is not None: options["input_shape"] = input_shape model.add(klass(**options)) @@ -174,8 +163,7 @@ def get_functional_model(config): - """ - Construct keras functional model from Galaxy tool parameters + """Construct keras functional model from Galaxy tool parameters Parameters ----------- @@ -221,8 +209,7 @@ def get_batch_generator(config): - """ - Construct keras online data generator from Galaxy tool parameters + """Construct keras online data generator from Galaxy tool parameters Parameters ----------- @@ -246,8 +233,7 @@ def config_keras_model(inputs, outfile): - """ - config keras model layers and output JSON + """config keras model layers and output JSON Parameters ---------- @@ -271,16 +257,8 @@ json.dump(json.loads(json_string), f, indent=2) -def build_keras_model( - inputs, - outfile, - model_json, - infile_weights=None, - batch_mode=False, - outfile_params=None, -): - """ - for `keras_model_builder` tool +def build_keras_model(inputs, outfile, model_json, batch_mode=False): + """for `keras_model_builder` tool Parameters ---------- @@ -290,12 +268,8 @@ Path to galaxy dataset containing the keras_galaxy model output. model_json : str Path to dataset containing keras model JSON. - infile_weights : str or None - If string, path to dataset containing model weights. batch_mode : bool, default=False Whether to build online batch classifier. - outfile_params : str, default=None - File path to search parameters output. """ with open(model_json, "r") as f: json_model = json.load(f) @@ -307,7 +281,7 @@ if json_model["class_name"] == "Sequential": options["model_type"] = "sequential" klass = Sequential - elif json_model["class_name"] == "Model": + elif json_model["class_name"] == "Functional": options["model_type"] = "functional" klass = Model else: @@ -315,8 +289,9 @@ # load prefitted model if inputs["mode_selection"]["mode_type"] == "prefitted": - estimator = klass.from_config(config) - estimator.load_weights(infile_weights) + # estimator = klass.from_config(config) + # estimator.load_weights(infile_weights) + raise Exception("Prefitted was deprecated!") # build train model else: cls_name = inputs["mode_selection"]["learning_type"] @@ -338,8 +313,10 @@ ) train_metrics = inputs["mode_selection"]["compile_params"]["metrics"] + if not isinstance(train_metrics, list): # for older galaxy + train_metrics = train_metrics.split(",") if train_metrics[-1] == "none": - train_metrics = train_metrics[:-1] + train_metrics.pop() options["metrics"] = train_metrics options.update(inputs["mode_selection"]["fit_params"]) @@ -355,19 +332,10 @@ "class_positive_factor" ] estimator = klass(config, **options) - if outfile_params: - hyper_params = get_search_params(estimator) - # TODO: remove this after making `verbose` tunable - for h_param in hyper_params: - if h_param[1].endswith("verbose"): - h_param[0] = "@" - df = pd.DataFrame(hyper_params, columns=["", "Parameter", "Value"]) - df.to_csv(outfile_params, sep="\t", index=False) print(repr(estimator)) - # save model by pickle - with open(outfile, "wb") as f: - pickle.dump(estimator, f, pickle.HIGHEST_PROTOCOL) + # save model + dump_model_to_h5(estimator, outfile, verbose=1) if __name__ == "__main__": @@ -377,9 +345,7 @@ aparser.add_argument("-i", "--inputs", dest="inputs", required=True) aparser.add_argument("-m", "--model_json", dest="model_json") aparser.add_argument("-t", "--tool_id", dest="tool_id") - aparser.add_argument("-w", "--infile_weights", dest="infile_weights") aparser.add_argument("-o", "--outfile", dest="outfile") - aparser.add_argument("-p", "--outfile_params", dest="outfile_params") args = aparser.parse_args() input_json_path = args.inputs @@ -388,9 +354,7 @@ tool_id = args.tool_id outfile = args.outfile - outfile_params = args.outfile_params model_json = args.model_json - infile_weights = args.infile_weights # for keras_model_config tool if tool_id == "keras_model_config": @@ -403,10 +367,5 @@ batch_mode = True build_keras_model( - inputs=inputs, - model_json=model_json, - infile_weights=infile_weights, - batch_mode=batch_mode, - outfile=outfile, - outfile_params=outfile_params, + inputs=inputs, model_json=model_json, batch_mode=batch_mode, outfile=outfile )