Mercurial > repos > bgruening > create_tool_recommendation_model
comparison optimise_hyperparameters.py @ 4:f0da532be419 draft
"planemo upload for repository https://github.com/bgruening/galaxytools/tree/recommendation_training/tools/tool_recommendation_model commit 5eebc0cb44e71f581d548b7e842002705dd155eb"
author | bgruening |
---|---|
date | Fri, 06 May 2022 09:04:44 +0000 |
parents | 98bc44d17561 |
children |
comparison
equal
deleted
inserted
replaced
3:98bc44d17561 | 4:f0da532be419 |
---|---|
1 """ | 1 """ |
2 Find the optimal combination of hyperparameters | 2 Find the optimal combination of hyperparameters |
3 """ | 3 """ |
4 | 4 |
5 import numpy as np | 5 import numpy as np |
6 from hyperopt import fmin, tpe, hp, STATUS_OK, Trials | |
7 | |
8 from keras.models import Sequential | |
9 from keras.layers import Dense, GRU, Dropout | |
10 from keras.layers.embeddings import Embedding | |
11 from keras.layers.core import SpatialDropout1D | |
12 from keras.optimizers import RMSprop | |
13 from keras.callbacks import EarlyStopping | |
14 | |
15 import utils | 6 import utils |
7 from hyperopt import fmin, hp, STATUS_OK, tpe, Trials | |
8 from tensorflow.keras.callbacks import EarlyStopping | |
9 from tensorflow.keras.layers import Dense, Dropout, Embedding, GRU, SpatialDropout1D | |
10 from tensorflow.keras.models import Sequential | |
11 from tensorflow.keras.optimizers import RMSprop | |
16 | 12 |
17 | 13 |
18 class HyperparameterOptimisation: | 14 class HyperparameterOptimisation: |
19 | |
20 def __init__(self): | 15 def __init__(self): |
21 """ Init method. """ | 16 """ Init method. """ |
22 | 17 |
23 def train_model(self, config, reverse_dictionary, train_data, train_labels, test_data, test_labels, tool_tr_samples, class_weights): | 18 def train_model( |
19 self, | |
20 config, | |
21 reverse_dictionary, | |
22 train_data, | |
23 train_labels, | |
24 test_data, | |
25 test_labels, | |
26 tool_tr_samples, | |
27 class_weights, | |
28 ): | |
24 """ | 29 """ |
25 Train a model and report accuracy | 30 Train a model and report accuracy |
26 """ | 31 """ |
27 # convert items to integer | 32 # convert items to integer |
28 l_batch_size = list(map(int, config["batch_size"].split(","))) | 33 l_batch_size = list(map(int, config["batch_size"].split(","))) |
38 optimize_n_epochs = int(config["optimize_n_epochs"]) | 43 optimize_n_epochs = int(config["optimize_n_epochs"]) |
39 | 44 |
40 # get dimensions | 45 # get dimensions |
41 dimensions = len(reverse_dictionary) + 1 | 46 dimensions = len(reverse_dictionary) + 1 |
42 best_model_params = dict() | 47 best_model_params = dict() |
43 early_stopping = EarlyStopping(monitor='val_loss', mode='min', verbose=1, min_delta=1e-1, restore_best_weights=True) | 48 early_stopping = EarlyStopping( |
49 monitor="val_loss", | |
50 mode="min", | |
51 verbose=1, | |
52 min_delta=1e-1, | |
53 restore_best_weights=True, | |
54 ) | |
44 | 55 |
45 # specify the search space for finding the best combination of parameters using Bayesian optimisation | 56 # specify the search space for finding the best combination of parameters using Bayesian optimisation |
46 params = { | 57 params = { |
47 "embedding_size": hp.quniform("embedding_size", l_embedding_size[0], l_embedding_size[1], 1), | 58 "embedding_size": hp.quniform( |
59 "embedding_size", l_embedding_size[0], l_embedding_size[1], 1 | |
60 ), | |
48 "units": hp.quniform("units", l_units[0], l_units[1], 1), | 61 "units": hp.quniform("units", l_units[0], l_units[1], 1), |
49 "batch_size": hp.quniform("batch_size", l_batch_size[0], l_batch_size[1], 1), | 62 "batch_size": hp.quniform( |
50 "learning_rate": hp.loguniform("learning_rate", np.log(l_learning_rate[0]), np.log(l_learning_rate[1])), | 63 "batch_size", l_batch_size[0], l_batch_size[1], 1 |
64 ), | |
65 "learning_rate": hp.loguniform( | |
66 "learning_rate", np.log(l_learning_rate[0]), np.log(l_learning_rate[1]) | |
67 ), | |
51 "dropout": hp.uniform("dropout", l_dropout[0], l_dropout[1]), | 68 "dropout": hp.uniform("dropout", l_dropout[0], l_dropout[1]), |
52 "spatial_dropout": hp.uniform("spatial_dropout", l_spatial_dropout[0], l_spatial_dropout[1]), | 69 "spatial_dropout": hp.uniform( |
53 "recurrent_dropout": hp.uniform("recurrent_dropout", l_recurrent_dropout[0], l_recurrent_dropout[1]) | 70 "spatial_dropout", l_spatial_dropout[0], l_spatial_dropout[1] |
71 ), | |
72 "recurrent_dropout": hp.uniform( | |
73 "recurrent_dropout", l_recurrent_dropout[0], l_recurrent_dropout[1] | |
74 ), | |
54 } | 75 } |
55 | 76 |
56 def create_model(params): | 77 def create_model(params): |
57 model = Sequential() | 78 model = Sequential() |
58 model.add(Embedding(dimensions, int(params["embedding_size"]), mask_zero=True)) | 79 model.add( |
80 Embedding(dimensions, int(params["embedding_size"]), mask_zero=True) | |
81 ) | |
59 model.add(SpatialDropout1D(params["spatial_dropout"])) | 82 model.add(SpatialDropout1D(params["spatial_dropout"])) |
60 model.add(GRU(int(params["units"]), dropout=params["dropout"], recurrent_dropout=params["recurrent_dropout"], return_sequences=True, activation="elu")) | 83 model.add( |
84 GRU( | |
85 int(params["units"]), | |
86 dropout=params["dropout"], | |
87 recurrent_dropout=params["recurrent_dropout"], | |
88 return_sequences=True, | |
89 activation="elu", | |
90 ) | |
91 ) | |
61 model.add(Dropout(params["dropout"])) | 92 model.add(Dropout(params["dropout"])) |
62 model.add(GRU(int(params["units"]), dropout=params["dropout"], recurrent_dropout=params["recurrent_dropout"], return_sequences=False, activation="elu")) | 93 model.add( |
94 GRU( | |
95 int(params["units"]), | |
96 dropout=params["dropout"], | |
97 recurrent_dropout=params["recurrent_dropout"], | |
98 return_sequences=False, | |
99 activation="elu", | |
100 ) | |
101 ) | |
63 model.add(Dropout(params["dropout"])) | 102 model.add(Dropout(params["dropout"])) |
64 model.add(Dense(2 * dimensions, activation="sigmoid")) | 103 model.add(Dense(2 * dimensions, activation="sigmoid")) |
65 optimizer_rms = RMSprop(lr=params["learning_rate"]) | 104 optimizer_rms = RMSprop(lr=params["learning_rate"]) |
66 batch_size = int(params["batch_size"]) | 105 batch_size = int(params["batch_size"]) |
67 model.compile(loss=utils.weighted_loss(class_weights), optimizer=optimizer_rms) | 106 model.compile( |
107 loss=utils.weighted_loss(class_weights), optimizer=optimizer_rms | |
108 ) | |
68 print(model.summary()) | 109 print(model.summary()) |
69 model_fit = model.fit_generator( | 110 model_fit = model.fit( |
70 utils.balanced_sample_generator( | 111 utils.balanced_sample_generator( |
71 train_data, | 112 train_data, |
72 train_labels, | 113 train_labels, |
73 batch_size, | 114 batch_size, |
74 tool_tr_samples, | 115 tool_tr_samples, |
75 reverse_dictionary | 116 reverse_dictionary, |
76 ), | 117 ), |
77 steps_per_epoch=len(train_data) // batch_size, | 118 steps_per_epoch=len(train_data) // batch_size, |
78 epochs=optimize_n_epochs, | 119 epochs=optimize_n_epochs, |
79 callbacks=[early_stopping], | 120 callbacks=[early_stopping], |
80 validation_data=(test_data, test_labels), | 121 validation_data=(test_data, test_labels), |
81 verbose=2, | 122 verbose=2, |
82 shuffle=True | 123 shuffle=True, |
83 ) | 124 ) |
84 return {'loss': model_fit.history["val_loss"][-1], 'status': STATUS_OK, 'model': model} | 125 return { |
126 "loss": model_fit.history["val_loss"][-1], | |
127 "status": STATUS_OK, | |
128 "model": model, | |
129 } | |
130 | |
85 # minimize the objective function using the set of parameters above | 131 # minimize the objective function using the set of parameters above |
86 trials = Trials() | 132 trials = Trials() |
87 learned_params = fmin(create_model, params, trials=trials, algo=tpe.suggest, max_evals=int(config["max_evals"])) | 133 learned_params = fmin( |
88 best_model = trials.results[np.argmin([r['loss'] for r in trials.results])]['model'] | 134 create_model, |
135 params, | |
136 trials=trials, | |
137 algo=tpe.suggest, | |
138 max_evals=int(config["max_evals"]), | |
139 ) | |
140 best_model = trials.results[np.argmin([r["loss"] for r in trials.results])][ | |
141 "model" | |
142 ] | |
89 # set the best params with respective values | 143 # set the best params with respective values |
90 for item in learned_params: | 144 for item in learned_params: |
91 item_val = learned_params[item] | 145 item_val = learned_params[item] |
92 best_model_params[item] = item_val | 146 best_model_params[item] = item_val |
93 return best_model_params, best_model | 147 return best_model_params, best_model |