Ami*_*ine -1

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

\n\n

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

\n\n
\n

sklearn 估计器是一个具有 fit(X,y) 、 Predict(x) 和 Score 方法的类对象。(以及可选的predict_proba方法)

\n
\n\n

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

\n\n
KerasClassifier(build_fn=None, **sk_params): which implements the Scikit-Learn classifier interface.\nKerasRegressor(build_fn=None, **sk_params): which implements the Scikit-Learn regressor interface.\n
Run Code Online (Sandbox Code Playgroud)\n\n

论据

\n\n
build_fn: callable function or class instance the should construct, compile and return a Keras model, which will then be used to fit/predict.\nsk_params: model parameters & fitting parameters.\n
Run Code Online (Sandbox Code Playgroud)\n\n
\n

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

\n
\n\n

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

\n\n

实现Keras模型创建器功能

\n\n

我们想要微调这些超参数:optimizer、dropout_rate、kernel_init method和dense_layer_sizes。

\n\n

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

\n\n

binary_crossentropy非常适合二分类问题。

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

创建类似 sklearn 的估计器

\n\n

它\xe2\x80\x99 是一个分类问题,因此我们使用 KerasClassifier 包装器。

\n\n
kears_estimator = KerasClassifier(build_fn=create_model, verbose=1)\n
Run Code Online (Sandbox Code Playgroud)\n\n

定义超参数空间

\n\n

我们在这里定义我们的超参数空间,包括 keras fit 超参数epochsbatch_size

\n\n
# define the grid search parameters\nparam_grid = {\n    epochs\': [10, 100, ],\n    dense_nparams\': [32, 256, 512],\n    init\': [ \'uniform\', \'zeros\', \'normal\', ], \n    batch_size\':[2, 16, 32],\n    optimizer\':[\'RMSprop\', \'Adam\', \'Adamax\', \'sgd\'],\n    dropout\': [0.5, 0.4, 0.3, 0.2, 0.1, 0]\n}\n
Run Code Online (Sandbox Code Playgroud)\n\n

最后使用 KFold 交叉验证执行网格搜索

\n\n
kfold_splits = 5\ngrid = GridSearchCV(estimator=kears_estimator,  \n                    n_jobs=-1, \n                    verbose=1,\n                    return_train_score=True,\n                    cv=kfold_splits,  #StratifiedKFold(n_splits=kfold_splits, shuffle=True)\n                    param_grid=param_grid,)\n\ngrid_result = grid.fit(X, y, )\n\n# summarize results\nprint("Best: %f using %s" % (grid_result.best_score_, grid_result.best_params_))\nmeans = grid_result.cv_results_[\'mean_test_score\']\nstds = grid_result.cv_results_[\'std_test_score\']\nparams = grid_result.cv_results_[\'params\']\nfor mean, stdev, param in zip(means, stds, params):\n    print("%f (%f) with: %r" % (mean, stdev, param))\n
Run Code Online (Sandbox Code Playgroud)\n

  • sklearn 网格搜索不适用于 keras 功能 API,因此答案并不能真正解决 OP 的问题。 (5认同)