Как мы можем настроить гиперпараметры нейронной сети, когда выходная переменная непрерывна? - PullRequest
0 голосов
/ 04 февраля 2020

Я искал ресурсы для настройки гиперпараметров моделей ANN с использованием TensorFlow в Python, и, безусловно, каждое сталкиваемое мной решение / обсуждение касается проблем классификации с категориальным выходным набором данных и использования простой логистики c регрессионные модели или GridSearch через sklearn (пока те, которые имеют дело только с двоичным выходом).

Моя проблема, однако, имеет непрерывный вывод, и я пытался реализовать GridSearch, но я столкнулся с ошибкой:
"ValueError: непрерывный не поддерживается"

  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_

1 Ответ

0 голосов
/ 04 февраля 2020

Сначала определите вашу модель в функции (вы также можете определить ее как класс с API-интерфейсом подклассов keras), затем, поскольку ваш вывод является непрерывным значением, вызовите keras scikit-learn wrapper KerasRegressor для работы с GridSearchCV или RandomizedSearchCV.

Прочитайте это , чтобы лучше понять различия между проблемами классификации и регрессии.

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))   
...