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

Posted

技术标签:

【中文标题】功能 API/多输入模型超参数优化【英文标题】:Functional API/Multi Input model hyperparameter optimization 【发布时间】:2020-01-16 08:27:18 【问题描述】:

我发现与 Keras 函数式 API 配合使用的唯一超参数优化库是 Talos。

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

有谁知道其他可以工作的吗?

【问题讨论】:

github.com/cerlymarco/keras-hypetune 【参考方案1】:

Talos 似乎不适用于当前的 TensorFlow 版本,我们可以做的最简单的方法是使用嵌套的 for 循环函数,但我们会牺牲交叉验证部分。

【讨论】:

您的答案可以通过额外的支持信息得到改进。请edit 添加更多详细信息,例如引用或文档,以便其他人可以确认您的答案是正确的。你可以找到更多关于如何写好答案的信息in the help center。【参考方案2】:

使用 KERAS 功能 API,您实际上可以让 GridSearchCV 工作。由于网格仅适用于顺序,因此您只需将模型与顺序层包装即可。

model = Sequential() 
model.add(Resnet50())

但不要忘记在添加之前调整您的 Keras 模型,最后添加 Dense 模型以映射结果。

在找到此解决方案之前,我已亲自尝试并运行过 GridSearch。

【讨论】:

【参考方案3】:

您可以使用带有交叉验证的 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 方法和dense_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 fit hyperparametersepochsbatch_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))

【讨论】:

sklearn 网格搜索不适用于 keras 功能 API,因此答案并不能真正解决 OP 的问题。 这只是解释顺序模型的过程,但是,像 resnet50 这样的函数模型将无法工作,因为它没有任何 predict_classes 函数。

以上是关于功能 API/多输入模型超参数优化的主要内容,如果未能解决你的问题,请参考以下文章

模型训练和参数优化

模型训练和参数优化

Pytorch 模型的超参数优化

优化分类基于matlab遗传算法优化支持向量机分类(多输入多分类)含Matlab源码 QF003期

Python 机器学习 | 超参数优化 黑盒(Black-Box)非凸优化技术实践

Python 机器学习 | 超参数优化 黑盒(Black-Box)非凸优化技术实践