功能性API /多输入模型超参数优化

时间:2019-09-15 03:35:26

标签: keras scikit-learn hyperparameters talos

我发现唯一可与Keras功能API一起使用的超参数优化库是Talos。

https://github.com/autonomio/talos/blob/9890d71d31451af3d7e8d91a75841bc7904db958/docs/Examples_Multiple_Inputs.md

有人知道其他会起作用的人吗?

1 个答案:

答案 0 :(得分:0)

您可以使用带有交叉验证的Sklearn网格搜索来执行Keras超参数调整。

要使用顺序Keras模型(仅单输入)执行网格搜索,必须使用Keras Wrappers for the Scikit-Learn API将这些模型转换为sklearn兼容的估计器。

  

sklearn估计量是具有fit(X,y),predict(x)和   评分方法。 (以及可选的predict_proba方法)

无需从头开始,可以通过实现keras.wrappers.scikit_learnpackage中的两个包装之一,将顺序Keras模型用作Scikit-Learn工作流程的一部分:

KerasClassifier(build_fn=None, **sk_params): which implements the Scikit-Learn classifier interface.
KerasRegressor(build_fn=None, **sk_params): which implements the Scikit-Learn regressor interface.

参数

build_fn: callable function or class instance the should construct, compile and return a Keras model, which will then be used to fit/predict.
sk_params: model parameters & fitting parameters.
  

请注意,像scikit-learn中的所有其他估算器一样,build_fn应该   提供其参数的默认值,以便您可以创建   估算器,而不将任何值传递给sk_params。

示例:使用Keras进行简单的二进制分类

实施Keras模型创建者功能

我们要微调以下超参数:优化器,dropout_rate,kernel_init方法和density_layer_sizes。

这些参数必须使用默认参数 create_model()函数的签名中定义。您可以根据需要添加其他超参数,例如learning_rate,...

binary_crossentropy 非常适合两类分类问题。

def create_model(dense_layer_sizes, optimizer="adam", dropout=0.1, init='uniform', nbr_features=2500, dense_nparams=256):
    model = Sequential()
    model.add(Dense(dense_nparams, activation='relu', input_shape=(nbr_features,), kernel_initializer=init,)) 
    model.add(Dropout(dropout), )
    for layer_size in dense_layer_sizes:
        model.add(Dense(layer_size, activation='relu'))
        model.add(Dropout(dropout), )
    model.add(Dense(1, activation='sigmoid'))
    model.compile(loss='binary_crossentropy', optimizer=optimizer,metrics=["accuracy"])
    return model

创建类似sklearn的估算器

这是一个分类问题,因此我们使用KerasClassifier包装器。

kears_estimator = KerasClassifier(build_fn=create_model, verbose=1)

定义超参数空间

我们在此处定义超参数空间,其中包括keras 拟合超参数历元 batch_size

# define the grid search parameters
param_grid = {
    epochs': [10, 100, ],
    dense_nparams': [32, 256, 512],
    init': [ 'uniform', 'zeros', 'normal', ], 
    batch_size':[2, 16, 32],
    optimizer':['RMSprop', 'Adam', 'Adamax', 'sgd'],
    dropout': [0.5, 0.4, 0.3, 0.2, 0.1, 0]
}

最后通过KFold交叉验证执行网格搜索

kfold_splits = 5
grid = GridSearchCV(estimator=kears_estimator,  
                    n_jobs=-1, 
                    verbose=1,
                    return_train_score=True,
                    cv=kfold_splits,  #StratifiedKFold(n_splits=kfold_splits, shuffle=True)
                    param_grid=param_grid,)

grid_result = grid.fit(X, y, )

# summarize results
print("Best: %f using %s" % (grid_result.best_score_, grid_result.best_params_))
means = grid_result.cv_results_['mean_test_score']
stds = grid_result.cv_results_['std_test_score']
params = grid_result.cv_results_['params']
for mean, stdev, param in zip(means, stds, params):
    print("%f (%f) with: %r" % (mean, stdev, param))