【问题标题】:How can we tune hyperparameters of neural network when the output variable is continuous?当输出变量是连续的时,我们如何调整神经网络的超参数?
【发布时间】:2020-05-19 17:27:44
【问题描述】:

我一直在寻找在 Python 中使用 TensorFlow 调整 ANN 模型超参数的资源,到目前为止,我遇到的每个解决方案/讨论都涉及分类输出数据集的分类问题,并使用简单的逻辑回归模型或 GridSearch sklearn(到目前为止,仅处理二进制输出的那些)。

但是,我的问题是连续输出,我试图实现 GridSearch,但遇到了错误:
"ValueError: Continuous is not supported"

  1. 我不确定当输出变量是连续的时GridSearch是否有效,但即使没有,也必须有一些其他函数可以帮助我优化我的参数?
  2. 在这种情况下,我们是否需要标准化输入和输出变量?对于连续输入和输出变量,最好的方法是什么?
from keras.wrappers.scikit_learn import KerasClassifier
from sklearn.model_selection import GridSearchCV
from keras.models import Sequential
from keras.layers import Dense
def build_classifier(optimizer):
    classifier = Sequential()
    classifier.add(Dense(10, input_dim = 5, activation = 'relu', kernel_initializer="uniform"))
    classifier.add(Dense(5, activation = 'relu', kernel_initializer = 'uniform'))
    classifier.add(Dense(1, activation = 'linear', kernel_initializer = 'uniform'))
    classifier.compile(optimizer = optimizer, loss = 'mse', metrics = ['accuracy'])
    return classifier
classifier = KerasClassifier(build_fn = build_classifier)
parameters = {'batch_size': [25, 32],
              'epochs': [100, 500],
              'optimizer': ['adam','rmsprop']}
grid_search = GridSearchCV(estimator = classifier, param_grid = parameters, scoring = 'accuracy', cv = 3)
grid_search = grid_search.fit(X_train, y_train)
best_parameters = grid_search.best_params_
best_accuracy = grid_search.best_score_

【问题讨论】:

  • 请分享所有相关代码/数据。请参阅:minimal reproducible exampleHow to Askhelp center
  • @AMC 我这样做了。很抱歉给您带来不便。
  • 您正在使用包装器 KerasClassifier,您应该使用 KerasRegressor。
  • @GuilhermeMarques 非常感谢。我会相应地更改代码。

标签: python tensorflow neural-network grid-search hyperparameters


【解决方案1】:

首先,在函数中定义您的模型(您也可以使用 keras 子类化 API 定义为一个类),然后,由于您的输出是一个连续值,请调用 keras scikit-learn wrapper KerasRegressor 以便使用GridSearchCV 或 RandomizedSearchCV。

阅读this 以更好地了解分类和回归问题之间的区别。

def build_model(n_neurons=30, learning_rate=1e-3, input_shape=[8]):
    model = keras.models.Sequential()
    model.add(keras.layers.InputLayer(input_shape))
    model.add(keras.layers.Dense(n_neurons, activation="relu"))
    model.add(keras.layers.Dense(1))
    optimizer = keras.optimizers.SGD(lr=learning_rate)
    model.compile(loss="mse", optimizer=optimizer)
    return model

keras_reg = keras.wrappers.scikit_learn.KerasRegressor(build_model)
params_distrib = { #  params you want try with }
rnd_search_cv = RandomizedSearchCV(keras_reg, params_distrib, n_iter=5, cv=3)
rnd_search_cv.fit(x_train, y_train, epochs=50, 
                    validation_data=(x_valid, y_valid))   

【讨论】:

    猜你喜欢
    • 2020-09-29
    • 2014-01-06
    • 2010-12-21
    • 2016-09-24
    • 2010-12-18
    • 1970-01-01
    • 2018-05-22
    • 2020-06-29
    • 2022-01-23
    相关资源
    最近更新 更多