Итак, у вас уже есть обученная модель, которую мы можем представить как f(x) = y
.
Стандартный метод SciPy, позволяющий минимизировать это, имеет соответствующее название scipy.optimize.minimize .
Чтобы использовать его, вам просто нужно адаптировать вашу функцию f(x) = y
для соответствия API, который использует SciPy. То есть первый аргумент функции - это список params
для оптимизации. Второй аргумент является необязательным и может содержать любые args
, которые фиксированы для всей оптимизации (т. Е. Ваша обученная модель).
def score_trained_model(params, args):
# Get the model from the fixed args.
model = args[0]
# Run the model on the params, return the output.
return model_predict(model, params)
С этим, плюс начальное предположение, вы можете использовать minimize
function now:
# Nelder-Mead is my go-to to start with.
# But it doesn't take advantage of the gradient.
# Something that does, e.g. BGFS, may perform better for your case.
method = 'Nelder-Mead'
# All zeros is fine, but improving this initial guess can help.
guess_params = [0]*14
# Given a trained model, optimize the inputs to minimize the output.
optim_params = scipy.optimize.minimize(
score_trained_model,
guess_params,
args=(trained_model,),
method=method,
)
Можно указать ограничения и границы для некоторых методов оптимизации. Для Nelder-Mead это не поддерживается, но вы можете просто вернуть очень большую ошибку при нарушении ограничений.
Более старый ответ.
OP хочет: оптимизируйте входные данные, x
, а не гиперпараметры.
Похоже, вы хотите оптимизировать гиперпараметры. Моя Python библиотека на выбор hyperopt
: https://github.com/hyperopt/hyperopt
Учитывая, что у вас уже есть некоторый обучающий и набранный код, например:
def train_and_score(args):
# Unpack args and train your model.
model = make_model(**args)
trained = train_model(model, **args)
# Return the output you want to minimize.
return score_model(trained)
Вы можете легко использовать hyperopt
для настройки таких параметров, как скорость обучения, отсев или выбор активаций:
from hyperopt import fmin, hp, tpe, space_eval
space = {
'lr': hp.loguniform('lr', np.log(0.01), np.log(0.5)),
'dropout': hp.uniform('dropout', 0, 1),
'activation': hp.choice('activation', ['relu', 'sigmoid']),
}
# Minimize the training score over the space.
trials = Trials()
best = fmin(train_and_score, space, trials=trials, algo=tpe.suggest, max_evals=100)
# Print details about the best results and hyperparameters.
print(best)
print(space_eval(space, best))
Существуют также библиотеки, которые помогут вам напрямую интегрировать это с Keras. Популярным выбором является hyperas
: https://github.com/maxpumperla/hyperas