Почему второй `fit` вызов на` GridSearchCV` работает бесконечно? - PullRequest
0 голосов
/ 29 мая 2018

Я настраиваю гиперпараметры в Keras модели, используя GridSearchCV из sklearn, как в этого урока

model = KerasClassifier(build_fn=create_model, verbose=0)
batch_size = [10, 20, 40, 60, 80, 100]
epochs = [10, 50, 100]
param_grid = dict(batch_size=batch_size, epochs=epochs)
grid = GridSearchCV(estimator=model, param_grid=param_grid, n_jobs=-1)

И они я вызываю fit метод, чтобы найтилучшие гиперпараметры

grid_result = grid.fit(X, Y)

Однако, допустим, я хочу изменить batch_sizes и снова вызвать fit (без перезапуска ядра в Jupyter).

batch_size = [15, 20, 25, 30, 35, 40]
param_grid = dict(batch_size=batch_size, epochs=epochs)
grid = GridSearchCV(estimator=model, param_grid=param_grid, n_jobs=-1)

И когда язвоните fit

grid_result = grid.fit(X, Y)

, он работает бесконечно и не прекращается.Чтобы соответствовать этим измененным параметрам, я должен перезапустить ядро, а затем перезагрузить данные, модули и т. Д.

Вопрос. Как я могу позвонить fit второй раз приGridSearchCV без перезапуска ядра?


Подробности. Я использую эти данные .Подробный фрагмент:

import numpy as np
from sklearn.model_selection import GridSearchCV
from keras.models import Sequential
from keras.layers import Dense
from keras.wrappers.scikit_learn import KerasClassifier

def create_model():
    model = Sequential()
    model.add(Dense(12, input_dim=8, activation='relu'))
    model.add(Dense(1, activation='sigmoid'))
    model.compile(loss='binary_crossentropy', optimizer='adam', metrics=['accuracy'])
    return model

dataset = np.loadtxt("data/pima-indians-diabetes.data.csv", delimiter=",")
X = dataset[:,0:8]
y = dataset[:,8]

model = KerasClassifier(build_fn=create_model, verbose=0)

batch_size = [10, 20, 40, 60, 80, 100]
epochs = [10, 50]
param_grid = dict(batch_size = batch_size, epochs = epochs)

grid = GridSearchCV(estimator=model, param_grid=param_grid, n_jobs=-1)

Затем я вызываю fit, и он отлично работает

grid_result = grid.fit(X, y)
print("Best: %f using %s" % (grid_result.best_score_, grid_result.best_params_))

Out: Best: 0.690104 using {'batch_size': 10, 'epochs': 50}

Затем я запускаю следующее, чтобы сделатьнекоторые изменения:

batch_size = [5, 10, 15, 20]
param_grid = dict(batch_size = batch_size, epochs = epochs)
grid = GridSearchCV(estimator=model, param_grid=param_grid, n_jobs=-1)

И, наконец, я вызываю fit во второй раз, который никогда не останавливается

grid_result = grid.fit(X, y)

1 Ответ

0 голосов
/ 29 мая 2018

Я могу воспроизвести ошибку на моем MacBook Pro.Я также использовал pima-indians-diabetes.data.csv набор данных.

Проблема здесь с сеансом тензорного потока.Если сеанс создается в родительском процессе до GridSearchCV.fit(), он наверняка зависнет.

Одним из возможных решений было бы ограничение всего кода создания сеанса на класс KerasClassifer и функцию создания модели.

Кроме того, вы можете захотеть ограничить использование памяти TF в функции создания модели или подклассе KerasClassifier.


Быстрое решение:

n_jobs = 1

но это займет много времени.


Ссылки:

Проблема зависания сеанса с pythonмногопроцессорная обработка

Keras + Tensorflow и многопроцессорная обработка в Python

Ограничение использования ресурсов для бэкэнда тензорного потока

GridSearchCV зависает при втором запуске

scikit-lean GridSearchCV n_jobs! = 1 замораживание

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...