Spaces:
Running
Running
"""Print the best model parameters and loss""" | |
import pickle as pkl | |
from pprint import PrettyPrinter | |
import hyperopt | |
import numpy as np | |
from hyperopt import Trials, fmin, hp, tpe | |
from space import space | |
# Change the following code to your file | |
################################################################################ | |
# TODO: Declare a folder to hold all trials objects | |
TRIALS_FOLDER = "trials2" | |
################################################################################ | |
def merge_trials(trials1, trials2_slice): | |
"""Merge two hyperopt trials objects | |
:trials1: The primary trials object | |
:trials2_slice: A slice of the trials object to be merged, | |
obtained with, e.g., trials2.trials[:10] | |
:returns: The merged trials object | |
""" | |
max_tid = 0 | |
if len(trials1.trials) > 0: | |
max_tid = max([trial["tid"] for trial in trials1.trials]) | |
for trial in trials2_slice: | |
tid = trial["tid"] + max_tid + 1 | |
hyperopt_trial = Trials().new_trial_docs( | |
tids=[None], specs=[None], results=[None], miscs=[None] | |
) | |
hyperopt_trial[0] = trial | |
hyperopt_trial[0]["tid"] = tid | |
hyperopt_trial[0]["misc"]["tid"] = tid | |
for key in hyperopt_trial[0]["misc"]["idxs"].keys(): | |
hyperopt_trial[0]["misc"]["idxs"][key] = [tid] | |
trials1.insert_trial_docs(hyperopt_trial) | |
trials1.refresh() | |
return trials1 | |
np.random.seed() | |
# Load up all runs: | |
import glob | |
path = TRIALS_FOLDER + "/*.pkl" | |
files = 0 | |
for fname in glob.glob(path): | |
trials_obj = pkl.load(open(fname, "rb")) | |
n_trials = trials_obj["n"] | |
trials_obj = trials_obj["trials"] | |
if files == 0: | |
trials = trials_obj | |
else: | |
trials = merge_trials(trials, trials_obj.trials[-n_trials:]) | |
files += 1 | |
print(files, "trials merged") | |
best_loss = np.inf | |
best_trial = None | |
try: | |
trials | |
except NameError: | |
raise NameError("No trials loaded. Be sure to set the right folder") | |
# for trial in trials: | |
# if trial['result']['status'] == 'ok': | |
# loss = trial['result']['loss'] | |
# if loss < best_loss: | |
# best_loss = loss | |
# best_trial = trial | |
# print(best_loss, best_trial['misc']['vals']) | |
# trials = sorted(trials, key=lambda x: (x['result']['loss'] if trials['result']['status'] == 'ok' else float('inf'))) | |
clean_trials = [] | |
for trial in trials: | |
clean_trials.append((trial["result"]["loss"], trial["misc"]["vals"])) | |
clean_trials = sorted(clean_trials, key=lambda x: x[0]) | |
pp = PrettyPrinter(indent=4) | |
for trial in clean_trials: | |
loss, params = trial | |
for k, value in params.items(): | |
value = value[0] | |
if isinstance(value, int): | |
possible_args = space[k].pos_args[1:] | |
try: | |
value = possible_args[value].obj | |
except AttributeError: | |
value = [arg.obj for arg in possible_args[value].pos_args] | |
params[k] = value | |
pp.pprint({"loss": loss, "params": params}) | |