使用 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 进行超参数优化的主要内容,如果未能解决你的问题,请参考以下文章