def _filter_by_guidelines_multi(self, location): """Helper to filter by guidelines when one of the guideline hyperparameters is directly affected by a hyperparameter that is given as a space choice Parameters ---------- location: Tuple Location of the hyperparameter space choice that affects the acceptable guideline values of a particular hyperparameter. In other words, this is the path of a hyperparameter, which, if changed, would change the expected default value of another hyperparameter Notes ----- This is used for Keras Experiments when the `optimizer` value in a model's `compile_params` is given as a hyperparameter space choice. Each possible value of `optimizer` prescribes different default values for the `optimizer_params` argument, so special measures need to be taken to ensure the correct Experiments are declared to fit within the constraints""" _model_params = deepcopy(self.model_params) if location == ("model_init_params", "compile_params", "optimizer"): from keras.optimizers import get as k_opt_get update_location = ("model_init_params", "compile_params", "optimizer_params") allowed_values = get_path(_model_params, location).bounds #################### Handle First Value (Dummy) #################### self._filter_by_guidelines() allowed_values = allowed_values[1:] #################### Handle Remaining Values #################### for allowed_val in allowed_values: updated_value = k_opt_get(allowed_val).get_config() def _visit(path, key, value): """If `path` + `key` == `update_location`, return default for this choice. Else, default_visit""" if path + (key, ) == update_location: return (key, updated_value) return (key, value) self._filter_by_guidelines( model_params=remap(_model_params, visit=_visit)) self.similar_experiments = sorted(self.similar_experiments, key=lambda _: _[1], reverse=True) else: raise ValueError( "Received unhandled location: {}".format(location))
def does_match_init_params_guidelines_multi(self, exp_id, params, score, location) -> bool: """Check candidate compatibility with `model_init_params` template guidelines when a guideline hyperparameter is directly affected by another hyperparameter that is given as a space choice Parameters ---------- exp_id: String Candidate Experiment ID params: Dict Candidate "model_init_params" to compare to the template in :attr:`model_params` score: Number Value of the candidate Experiment's target metric location: Tuple Location of the hyperparameter space choice that affects the acceptable guideline values of a particular hyperparameter. In other words, this is the path of a hyperparameter, which, if changed, would change the expected default value of another hyperparameter Returns ------- Boolean True if candidate `params` match `model_init_params` guidelines. Else, False Notes ----- This is used for Keras Experiments when the `optimizer` value in a model's `compile_params` is given as a hyperparameter space choice. Each possible value of `optimizer` prescribes different default values for the `optimizer_params` argument, so special measures need to be taken to ensure the correct Experiments are declared to fit within the constraints""" _model_params = deepcopy(self.model_params["model_init_params"]) if location == ("compile_params", "optimizer"): from keras.optimizers import get as k_opt_get update_location = ("compile_params", "optimizer_params") # `update_location` = Path to hyperparameter whose default value depends on `location` allowed_values = get_path(_model_params, location).bounds # `allowed_values` = Good `("model_init_params", "compile_params", "optimizer")` values #################### Handle First Value (Dummy) #################### is_match = self.does_match_init_params_guidelines( exp_id, params, score) # The first value gets handled separately from the rest because the value at # `update_location` is set according to `allowed_values[0]`. For the remaining # `allowed_values`, we need to manually set `update_location` for each # If the first value was a match, the below `while` loop will never be entered because # `is_match` is already True #################### Handle Remaining Values #################### allowed_val_index = 1 while is_match is not True and allowed_val_index < len( allowed_values): allowed_val = allowed_values[allowed_val_index] # Determine current default value for the dependent hyperparameter updated_val = k_opt_get(allowed_val).get_config() # Set value at `update_location` to `updated_val`, then check if params match def _visit(path, key, value): """If `path` + `key` == `update_location`, return default for this choice. Else, default_visit""" if path + (key, ) == update_location: return (key, updated_val) return (key, value) is_match = self.does_match_init_params_guidelines( exp_id, params, score, template_params=remap(_model_params, visit=_visit)) # If `is_match` is True, the loop stops and :attr:`match_status`'s value at `exp_id` # for `does_match_init_params_guidelines` remains truthy allowed_val_index += 1 return is_match else: raise ValueError( "Received unhandled location: {}".format(location))