3

我正在尝试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 个 epoch,而是运行[50, 100, 200]我在网格中提供的。就像epochs=10被覆盖了一样。

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

我希望这对你更有意义。

4

1 回答 1

2

我对 KerasClassifier 不熟悉,但我认为您在不了解发生了什么的情况下试图完成太多工作。使用您当前正在测试的参数,您将运行 21,504 次迭代以获得一个 CV 折叠!假设您的数据集并非完全微不足道,并且至少需要 2 秒才能适应,那么您至少可以看到 12 小时的网格搜索。众所周知,对于像神经网络这样的昂贵功能,网格搜索并不是最有效的 CV 策略。随机搜索和贝叶斯优化已被证明更有效,并且能够提供可比较或更好的结果。但是,正如我所说,这变得太复杂了!

我建议阅读所有这些激活函数、优化器和学习率等,并缩小你的搜索空间。在开始 CV 之前尽可能多地调整您的数据。此外,实现某种折叠 CV 是一种很好的做法,例如 K 折叠或分层 k 折叠。也阅读这些,它们很重要。

如果您仍在寻求实现这一点,您可能会发现手动创建两个for循环更容易:一个用于迭代每个参数的外部循环和一个用于迭代每个超参数的内部循环。在最里面的循环中,您可以在此处构建、编译和拟合您的模型,而无需使用 sklearn 或 KerasClassifier(这隐藏了许多重要的细节)。您还可以借此机会了解更多关于函数式与顺序式 Keras 的信息,可以说前者更强大。

我为没有回答而道歉,我只是认为你可能会让自己比必要的更头痛!祝你好运。

于 2019-03-13T18:48:11.827 回答