GridsearchCV异常

时间:2019-03-12 13:58:03

标签: python scikit-learn gridsearchcv

我正在尝试GridsearchCV,但是我想在param grid中有一些例外。这是我的网格搜索代码:

from sklearn.model_selection import GridSearchCV
from keras.wrappers.scikit_learn import KerasClassifier

def create_model(input_dim=25, activation='relu', units=100, optimizer = 'adam', init='he_normal', dropout_rate=0.33):

       model = Sequential()
       model.add(Dense(input_dim=input_dim,
                       units=units, 
                       kernel_initializer=init, 
                       activation=activation))
       model.add(Dropout(dropout_rate))
       model.add(Dense(1, kernel_initializer=init, activation='sigmoid'))
       model.compile(loss='binary_crossentropy', optimizer=optimizer, metrics=['accuracy'])
       return model

model = KerasClassifier(build_fn=create_model, epochs=10, batch_size=64, verbose=1)

#lr = [0.01, 0.001, 0.0001] # [x/100 for x in range(1, 10)] #learning rate for optimizer
units = [int(train_X.shape[1]/2), train_X.shape[1], train_X.shape[1]*2, train_X.shape[1]*3]
batch_size = [32, 64, 128, 256]
optimizer = ['SGD', 'RMSprop', 'Adagrad', 'Adadelta', 'Adam', 'Adamax', 'Nadam']
epochs = [50, 100, 200]
init = ['uniform', 'lecun_uniform', 'normal', 'zero', 'glorot_normal', 'glorot_uniform', 'he_normal', 'he_uniform']
activation = ['softmax', 'softplus', 'softsign', 'relu', 'tanh', 'sigmoid', 'hard_sigmoid', 'linear']
dropout_rate = [0.2, 0.3, 0.4, 0.5]

cv = [(slice(None), slice(None))]

param_grid = dict(units=units, batch_size=batch_size, optimizer=optimizer, epochs=epochs, 
                  init=init, activation=activation, dropout_rate=dropout_rate)

grid = GridSearchCV(cv=cv, estimator=model, param_grid=param_grid, n_jobs=1)
grid_result = grid.fit(train_X, train_y, validation_data=(valid_X, valid_y))

当我运行他的代码时,即使KerasClassifier的参数为epochs=10,网格也永远不会运行10个时期,而是为我在网格中提供的[50, 100, 200]运行。就像epochs=10被覆盖了。

现在我想做的是,我想在第一层使用不同的activation functions,但在输出层保留Sigmoid。我担心的是,activation='sigmoid'参数会被来自网格的activation = ['softmax', 'softplus', 'softsign', 'relu', 'tanh', 'sigmoid', 'hard_sigmoid', 'linear']参数覆盖吗?

我希望这对您更有意义。

1 个答案:

答案 0 :(得分:0)

我对KerasClassifier并不熟悉,但是我认为您在不了解正在发生的事情的情况下试图做太多事情。使用当前正在测试的参数,您将以21个CV倍数运行21,504次迭代!假设您的数据集并非完全无关紧要,并且至少需要2秒钟才能适应,那么您正在那里进行12个小时的网格搜索,至少 。一段时间以来,人们已经知道,对于诸如神经网络这样的昂贵功能,网格搜索并不是最有效的简历策略。事实证明,随机搜索和贝叶斯优化更为有效,并且能够提供可比或更好的结果。正如我所说的, 这太复杂了!

我建议阅读所有这些激活功能和优化器以及学习率等信息,并缩小搜索范围。开始简历之前,请对您的数据进行尽可能多的调整。此外,优良作法是实现某种折叠式简历,例如K折或分层K折。还要阅读这些内容,它们很重要。

如果您仍希望实现此功能,可能会发现手动创建两个for循环会更容易:一个用于循环访问每个参数的外部循环和一个用于循环访问每个超参数的内部循环。在最内层的循环中,您可以在那里直接构建,编译和拟合模型,而完全不必使用sklearn或KerasClassifier(这隐藏了许多重要的细节)。您还可以利用这个机会来学习更多有关功能性Keras和顺序Keras的知识,前者无疑是功能更强大的。

对于未回答,我深表歉意,我只是认为您可能会引起自己的不必要的头痛!祝你好运。