当输出变量是连续的时,我们如何调整神经网络的超参数?
How can we tune hyperparameters of neural network when the output variable is continuous?
我一直在寻找使用 TensorFlow 调整 ANN 模型超参数的资源 Python,到目前为止,我遇到的每个 solution/discussion 都涉及分类输出数据集的分类问题,并且通过 sklearn 使用简单的逻辑回归模型或 GridSearch(到目前为止,那些只处理二进制输出)。
然而,我的问题是连续输出,我试图实现 GridSearch,但我 运行 遇到错误:
"ValueError: continuous is not supported"
- 我不确定当输出变量是连续的时候GridSearch是否工作,但即使不工作,一定有一些其他的函数可以帮助我优化我的参数?
- 在这种情况下,我们是否需要规范化输入和输出变量?对于连续输入和输出变量,这样做的最佳方法是什么?
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_
首先,在一个函数中定义你的模型(你也可以用keras subclassing API定义为class),然后,因为你的输出是连续的值,调用 keras scikit-learn wrapper KerasRegressor
以使用 GridSearchCV 或 RandomizedSearchCV。
阅读 this 以更好地理解 class 化和回归问题之间的区别。
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))
我一直在寻找使用 TensorFlow 调整 ANN 模型超参数的资源 Python,到目前为止,我遇到的每个 solution/discussion 都涉及分类输出数据集的分类问题,并且通过 sklearn 使用简单的逻辑回归模型或 GridSearch(到目前为止,那些只处理二进制输出)。
然而,我的问题是连续输出,我试图实现 GridSearch,但我 运行 遇到错误:
"ValueError: continuous is not supported"
- 我不确定当输出变量是连续的时候GridSearch是否工作,但即使不工作,一定有一些其他的函数可以帮助我优化我的参数?
- 在这种情况下,我们是否需要规范化输入和输出变量?对于连续输入和输出变量,这样做的最佳方法是什么?
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_
首先,在一个函数中定义你的模型(你也可以用keras subclassing API定义为class),然后,因为你的输出是连续的值,调用 keras scikit-learn wrapper KerasRegressor
以使用 GridSearchCV 或 RandomizedSearchCV。
阅读 this 以更好地理解 class 化和回归问题之间的区别。
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))