maxim5 / hyper-engine

Python library for Bayesian hyper-parameters optimization
https://pypi.python.org/pypi/hyperengine
Apache License 2.0
86 stars 22 forks source link

Black box optimizer example #13

Open KOLANICH opened 6 years ago

KOLANICH commented 6 years ago
import hyperengine
import numpy as np

def rosenbrock(hyperparams):
    return (hyperparams["x"]-1)**2 + 10*(hyperparams["x"]**2-hyperparams["y"])**2

class BlackBoxSolver:
    def __init__(self, func):
        self.func=func
        self._val_loss_curve = []

    def train(self):
        loss=self.func()
        self._val_loss_curve.append(loss)
        return self._reducer(self._val_loss_curve)

    def _reducer(self, *args, **kwargs):
        return np.min(*args, **kwargs)

    def terminate(self):
        pass

def solver_generator(hyperparams):
    return BlackBoxSolver(partial(rosenbrock, hyperparams))

class IterLimitedHyperTuner(hyperengine.HyperTuner):
    def __init__(self, hyper_params_spec, solver_generator, iterLimit, *args, **kwargs):
        j=0
        def solver_generator_limited(hyperparams):
            nonlocal j
            if j<iterLimit:
                j+=1
                return solver_generator(hyperparams)
            else:
                raise StopIteration()

        super().__init__(hyper_params_spec, solver_generator_limited, *args, **kwargs)

    def tune(self):
        try:
            super().tune()
        except StopIteration as ex:
            minLossPointNum=np.argmin(self.strategy.values)
            return dict(zip(self.parsed._spec.keys(), self.strategy.points[minLossPointNum]))

spec=hp.new({
    "x": hp.uniform(-10, 10),
    "y": hp.uniform(-10, 10),
})
tuner=IterLimitedHyperTuner(spec, solver_generator, iterLimit=10, strategy='bayesian') #'portfolio'
tuner.tune()
maxim5 commented 6 years ago

@KOLANICH Can you describe this code please?

KOLANICH commented 6 years ago

The lower part is a workaround for then missing iteration limit. The upper part is an adapter adapting any function into HyperSolver-compatible object.