我正在使用 sklearn 在 Keras 模型上执行超参数调整优化(hyperopt)任务。我正在尝试使用 Sklearn 交叉验证来优化 KerasClassifiers,一些代码如下:
def create_model():
model = Sequential()
model.add(
Dense(output_dim=params['units1'],
input_dim=features_.shape[1],
kernel_initializer="glorot_uniform"))
model.add(Activation(params['activation']))
model.add(Dropout(params['dropout1']))
model.add(BatchNormalization())
...
model.compile(loss='binary_crossentropy',
optimizer='adam',
metrics=['accuracy'])
return model
现在我要做的是使用以下方式将 Hyperopt 参数传递给 KerasClassifier
def objective(params, n_folds=N_FOLDS):
"""Objective function for Hyperparameter Optimization"""
# Keep track of evals
global ITERATION
ITERATION += 1
clf = KerasClassifier(build_fn=create_model,**params)
start = timer()
# Perform n_folds cross validation
cv_results = cross_val_score(clf,
features_,
labels,
cv=5
).mean()
run_time = timer() - start
# Loss must be minimized
loss = -cv_results
# Dictionary with information for evaluation
return {
'loss': loss,
'params': params,
'iteration': ITERATION,
'train_time': run_time,
'status': STATUS_OK
}
我将搜索空间定义为:
space = {'units1': hp.choice('units1', [64, 128, 256, 512]),
'units2': hp.choice('units2', [64, 128, 256, 512]),
'dropout1': hp.choice('dropout1', [0.25, 0.5, 0.75]),
'dropout2': hp.choice('dropout2', [0.25, 0.5, 0.75]),
'batch_size': hp.choice('batch_size', [10, 20, 40, 60, 80, 100]),
'nb_epochs': hp.choice('nb_epochs', [10, 50, 100]),
'optimizer': opt_search_space,
'activation': 'relu' }
运行优化
best = fmin(fn = objective, space = space, algo = tpe.suggest,
max_evals = MAX_EVALS, trials = bayes_trials, rstate = np.random.RandomState(50))
但它没有给出这个错误:
ValueError:激活不是合法参数
正确的方法是什么?