如何将 GridSearchCV 与 Early Stopping 结合起来?

数据挖掘 scikit-学习 超参数调整 卷积神经网络 网格搜索 时代
2021-10-08 11:57:45

我是机器学习的初学者,想训练一个具有优化的超参数的 CNN(用于图像识别),例如 dropout 率、学习率和 epoch 数。

我尝试通过 Scikit-learn 的 GridSearchCV 找到最佳超参数。我经常读到 GridSearchCV 可以与提前停止结合使用,但我找不到演示这点的示例代码。

使用 EarlyStopping 我会尝试找到最佳时期数,但我不知道如何将 EarlyStopping 与 GridSearchCV 或至少与交叉验证结合起来。

谁能给我一个关于如何做到这一点的提示,这将是一个很大的帮助?

我当前的代码如下所示:

def create_model(dropout_rate_1=0.0, dropout_rate_2=0.0, learn_rate=0.001):
    model = Sequential()
    model.add(Conv2D(32, kernel_size=(3,3), input_shape=(28,28,1), activation='relu', padding='same')
    model.add(Conv2D(32, kernel_size=(3,3), activation='relu', padding='same')
    model.add(MaxPooling2D(pool_size=(2,2)))
    model.add(Dropout(dropout_rate_1))
    model.add(Dense(128, activation='relu'))
    model.add(Dropout(dropout_rate_2))
    model.add(Dense(10, activation='softmax'))
    optimizer=Adam(lr=learn_rate)
    model.compile(loss='categorical_crossentropy', optimizer=optimizer, 
                             metrics=['accuracy'])
    return model

model = KerasClassifier(build_fn=create_model, epochs=50, batch_size=10, verbose=0)
epochs = [30, 40, 50, 60]
dropout_rate_1 = [0.0, 0.2, 0.4, 0.6]
dropout_rate_2 = [0.0, 0.2, 0.4, 0.6]
learn_rate = [0.0001, 0.001, 0.01]
param_grid = dict(dropout_rate_1=dropout_rate_1, dropout_rate_2=dropout_rate_2,
                        learn_rate=learn_rate, epochs=epochs)
grid = GridSearchCV(estimator=model, param_grid=param_grid, n_jobs=-1, cv=5)
grid_result = grid.fit(X, y) 


3个回答

只是在这里添加到其他人。我猜你只需要在你的fit().

就像是:

from keras.callbacks import EarlyStopping
# Define early stopping
early_stopping = EarlyStopping(monitor='val_loss', patience=epochs_to_wait_for_improve)
# Add ES into fit
history = model.fit(..., callbacks=[early_stopping])

如果您需要代码建议,请在将来指定您的框架。我假设您正在使用 Keras

我可以为您的案例提供最低可行的实施方案。

from sklearn.base import ClassifierMixin, BaseEstimator

class CNN_model(ClassifierMixin, BaseEstimator) :
      def __init__(**model_params) :
          """
              define model parameters within this init function
          """
          self.model = # Use the params above and make a keras model and store it in this variable
          self.model.compile(loss=  , optimizer =   , metrics=[]) # Please fill-in the appropriate loss and metrics

       def fit(X,y) :
          self.model.fit(X,y, training_params)
          # You specify everything in training_params e.g. epoch, callbacks(which includes early stopping)
          return self

       def predict(X) :
          return self.model.predict(X)

所以基本上上面的代码创建了一个自定义的 sklearn 估计器实例,如果你成功构建,它可以与 GridSearchCV 结合使用。

GridSearchCv with Early Stopping - 我很好奇你的问题。只要算法内置了 Early Stopper 功能,您就可以通过这种方式使用它。

当涉及到其他算法时,它可能无法达到提前停止的目的,因为在您对它们进行实验之前,您永远不知道哪些参数会是最好的。