使用 GridSearch 进行超参数优化

Posted

技术标签:

【中文标题】使用 GridSearch 进行超参数优化【英文标题】:Hyperparameters optimization using GridSearch 【发布时间】:2018-09-01 09:23:21 【问题描述】:

所以我一直在尝试使用网格搜索来优化我的 keras 模型的参数,并且对于大多数部分来说它工作得很好,但是每当我尝试优化每一层的参数时,模型就会挂起。我想知道是否有人可以调查它并告诉我发生了什么,或者我做错了什么。

def create_model(dense_layers=2,
             dense_size_1=6,
             dense_size_2=7,
             init_mode_1='uniform',
             init_mode_2='uniform',
             gd='adam',
             transfer_1='relu', transfer_2='relu'):
    K.clear_session()
    model = Sequential()
    for i in range(0, dense_layers+1):
        if i == 1:
            model.add(Dense(dense_size_1,input_dim=8,activation=transfer_1, kernel_initializer=init_mode_1))
        if i == 2:
            model.add(Dense(dense_size_2, activation=transfer_2, kernel_initializer=init_mode_2))
    model.add(Dense(1, activation='sigmoid'))
    model.compile(loss='binary_crossentropy', optimizer=gd, metrics= ['accuracy'])
return model


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

dense_size_1 = [1, 5, 10, 15, 20, 25, 30]
dense_size_2 = [1, 5, 10, 15, 20, 25, 30]
init_mode_1 = ['uniform', 'lecun_uniform', 'normal', 'zero', 'glorot_normal', 'glorot_uniform', 'he_normal', 'he_uniform']
init_mode_2 = ['uniform', 'lecun_uniform', 'normal', 'zero', 'glorot_normal', 'glorot_uniform', 'he_normal', 'he_uniform']
gd = ['adam', 'sgd']
transfer_1 = ['relu', 'tanh']
transfer_2 = ['relu', 'tanh']

param_grid = dict(dense_size_1=dense_size_1, dense_size_2=dense_size_2,
                  init_mode_1=init_mode_1, init_mode_2=init_mode_2,
                  transfer_1=transfer_1, transfer_2=transfer_2)

grid = GridSearchCV(estimator=model, param_grid=param_grid, n_jobs=-1

grid_result = grid.fit(X, y)

如果我只为每一层使用隐藏神经元、优化器、时期和批量大小等参数,它就可以很好地工作,但是如果我让它更复杂,比如每个隐藏层中神经元的单独激活函数或单独的内核初始化器,它就会挂起对于每个隐藏层中的神经元。

这可能出了什么问题?

【问题讨论】:

在执行期间检查您的系统内存并记住:模型只是挂起不是一个非常技术性的描述。 老实说,我不知道我还能如何解释“Hang”的技术性。它只是停止。当我尝试其他参数(我在上面描述的)时,终端没有更新。如果我不尝试优化每个神经元的复杂性,它就是“工作正常”,否则“它挂起”。 请先尝试n_jobs=1。在进行并行(多线程)处理时,这似乎是一个问题。 【参考方案1】:

您可以在适当的位置使用 talos 进行网格搜索。请在下面找到代码:

### p contains the dictionary of parameter to be tuned ###
p = 'first_neuron': [4, 8, 12, 24, 48,64],
    'second_neuron': [4, 8, 12, 24, 48,64],
    'third_neuron': [4, 8, 12, 24, 48,64],
    'activation': ['relu'],
   'batch_size': [1000, 2000, 7000]

# add input parameters to the function #########################
def outage(x_train, y_train, x_val, y_val, params):
    # replace the hyperparameter inputs with references to params dictionary ##
    model = Sequential()
    ### Input layer 
    model.add(Dense(100, input_dim=100, activation=params['activation']))
    ### Introducing 3 hidden layers 
    model.add(Dense(params['first_neuron'], activation=params['activation']))
    model.add(Dense(params['second_neuron'], activation=params['activation']))
    model.add(Dense(params['third_neuron'], activation=params['activation']))
    ### Output layer with activation = linear (default)
    model.add(Dense(1))
    ### Defining loss function, optimizer and accuracy 
    model.compile(loss='binary_crossentropy', optimizer='adam', metrics=['accuracy'])
    ### make sure history object is returned by model.fit() 
    out = model.fit(x=x_train, 
                y=y_train,
                validation_data=[x_val, y_val],
                epochs=100,
                batch_size=params['batch_size'],
                verbose= False)
    #### return the output model 
    return out, model

### Talos hyperparameter 
t = talos.Scan(x=x_train, y=y_train, 
          params=p, model=outage, experiment_name='neural')

参考链接

more detail on how to use more details on Talos

【讨论】:

以上是关于使用 GridSearch 进行超参数优化的主要内容,如果未能解决你的问题,请参考以下文章

Gridsearchcv 与贝叶斯优化

使用 Gridsearch 进行超参数搜索,给出不起作用的参数值

我无法在 gridsearch 中添加优化器参数

Scikit 网格搜索参数(不是超参数)

Python:没有机器学习的网格搜索?

贝叶斯优化(Bayesian Optimization)深入理解