【问题标题】:I can't add optimizer parameter in gridsearch我无法在 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 版本是什么?

标签: python keras scikit-learn deep-learning neural-network


【解决方案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

      【讨论】:

        猜你喜欢
        • 2018-09-01
        • 2020-03-07
        • 2018-09-24
        • 2021-11-29
        • 2019-09-02
        • 1970-01-01
        • 2018-11-20
        • 1970-01-01
        • 2021-04-20
        相关资源
        最近更新 更多