我无法在 gridsearch 中添加优化器参数
Posted
技术标签:
【中文标题】我无法在 gridsearch 中添加优化器参数【英文标题】:I can't add optimizer parameter in gridsearch 【发布时间】:2019-05-17 07:52:37 【问题描述】:from keras.wrappers.scikit_learn import KerasClassifier
from sklearn.model_selection import GridSearchCV
def build_classifier():
classifier = Sequential()
classifier.add(Dense(units = 6 , init='uniform' , activation= 'relu'))
classifier.add(Dense(units = 6 , init='uniform' , activation= 'relu'))
classifier.add(Dense(units = 1 , init='uniform' , activation= 'sigmoid'))
classifier.compile(optimizer='adam' , loss = 'binary_crossentropy' ,
metrics=['accuracy'])
return classifier
KC = KerasClassifier(build_fn=build_classifier)
parameters = 'batch_size' : [25,32],
'epochs' : [100,500],
'optimizer':['adam','rmsprop']
grid_search = GridSearchCV(estimator=KC ,
param_grid=parameters,scoring='accuracy',cv=10)
grid_search.fit(X_train,y_train)
我想用不同的优化器测试模型。但我似乎无法在网格搜索中添加优化器。每当我运行程序时,它都会显示有关拟合训练集的错误。
ValueError: 优化器不是合法参数
【问题讨论】:
你的 Keras 和 scikit-learn 版本是什么? 【参考方案1】:keras for scikit-learn 的文档说:
sk_params 采用模型参数和拟合参数。合法的 模型参数是 build_fn 的参数。请注意,像所有 scikit-learn 中的其他估算器,build_fn 应该提供默认值 其参数的值,以便您可以创建估算器 不向 sk_params 传递任何值。
GridSearchCV
将在KerasClassifier
上调用get_params()
以获取可以传递给它的有效参数列表,根据您的代码:
KC = KerasClassifier(build_fn=build_classifier)
将为空(因为您没有在 build_classifier
中指定任何参数)。
将其更改为:
# Used a parameter to specify the optimizer
def build_classifier(optimizer = 'adam'):
...
classifier.compile(optimizer=optimizer , loss = 'binary_crossentropy' ,
metrics=['accuracy'])
...
return classifier
之后它应该可以工作了。
【讨论】:
【参考方案2】:我认为如果你添加 optimizer = 'adam' 作为你的 build_classifier 的参数然后 optimizer=optimizer 作为编译参数
from keras.wrappers.scikit_learn import KerasClassifier
from sklearn.model_selection import GridSearchCV
def build_classifier(**optimizer='adam'):
classifier = Sequential()
classifier.add(Dense(units = 6 , init='uniform' , activation= 'relu'))
classifier.add(Dense(units = 6 , init='uniform' , activation= 'relu'))
classifier.add(Dense(units = 1 , init='uniform' , activation= 'sigmoid'))
classifier.compile(optimizer=optimizer , loss = 'binary_crossentropy' ,
metrics=['accuracy'])
return classifier
KC = KerasClassifier(build_fn=build_classifier)
parameters = 'batch_size' : [25,32],
'epochs' : [100,500],
'optimizer':['adam','rmsprop']
grid_search = GridSearchCV(estimator=KC ,
param_grid=parameters,scoring='accuracy',cv=10)
grid_search.fit(X_train,y_train)
【讨论】:
【参考方案3】:# Function to create model, required for KerasClassifier
def create_model( optimizer='adam'):
model = Sequential()
model.add(Dense(150, input_dim=13, activation='relu'))
model.add(Dense(80, activation='relu'))
model.add(Dense(2, activation='softmax'))
model.compile(loss='categorical_crossentropy', optimizer='adam', metrics=
['accuracy'])
return model
# create model
model = KerasClassifier(build_fn=create_model, verbose=0)
# define the grid search parameters
batch_size = [10, 20]
epochs = [10, 50]
optimizer = ['adam','rmsprop']
param_grid = dict(optimizer=optimizer,batch_size=batch_size, epochs=epochs)
grid = GridSearchCV(estimator=model, param_grid=param_grid, n_jobs=-1, cv=3)
grid_result = grid.fit(X, y)
第一个optimizer=optimizer
,第二个batch_size=batch_size
,最后一个epochs=epochs
。
【讨论】:
以上是关于我无法在 gridsearch 中添加优化器参数的主要内容,如果未能解决你的问题,请参考以下文章
ValueError:使用 GridSearch 参数时估计器 CountVectorizer 的参数模型无效
GridSearch 用于 OneVsRestClassifier 中的估计器
火炉炼AI机器学习017-使用GridSearch搜索最佳参数组合
GridSearch:必须始终传递“Layer.call”的第一个参数