1,目的是想在python/keras中,使用Grid Search对神经网络超参数进行调参,即调用sklearn中的GridSearchCV函数。具体步骤可以参考:python/keras中用Grid Search对神经网络超参数进行调参。
2,其中核心为使用KerasClassifier或KerasRegressor类包装Keras model,从而使keras model适用于scikit-learn。
要使用这些包装,必须定义一个函数,以便按顺序模式创建model并返回keras model。然后当构建KerasClassifier类时,把该函数的return value(即keras model)传递给build_fn参数。
def create_model():
model = Sequential()
...
return model
model = KerasClassifier(build_fn=create_model)
其中KerasClassifier类的构造也可以使用新的参数,如下所示。
model = KerasClassifier(build_fn=create_model, nb_epoch=10)
3,一个简单的grid search搜索示例如下。
batch_size = [32, 64, 128, 256, 512, 1024]
epochs = [1, 5, 10, 20, 50, 100]
# train and find the best parameters
param_grid = dict(batch_size=batch_size, nb_epoch=epochs)
grid = GridSearchCV(estimator=model, param_grid=param_grid, n_jobs=1)
grid_result = grid.fit(X_train, Y_train)
其中首先需要提供超参数字典dict(),以便用来评价param_grid参数。
其次默认选择acc作为优化的核心(score参数),但其他核心也可指定用于GridSearchCV构造函数的score参数。
另外需要注意的是默认情况下网格搜索只使用一个线程(n_jobs=1)。但在GridSearchCV构造函数中,可以通过将 n_jobs参数设置为-1,则进程将使用计算机上的所有内核(适用于分布式环境)。
最后默认使用3层交叉验证,即cv=3,也可以设置其他cv value。
网格搜索的输出由grid.fit()返回。其中best_score_成员提供优化过程期间观察到的最好的评分, best_params_描述了已取得最佳结果的参数的组合。
4,关于GridSearchCV的参数含义还可以参考:GridSearchCV参数以及n_jobs参数解析。