Scikit-learn и keras многоядерная команда n_jobs = -1 - PullRequest
0 голосов
/ 07 декабря 2018

Я только что создал искусственную нейронную сеть с Keras, и я хочу передать ей функцию Scikit-learn cross_val_score для обучения ее некоторым X_train и y_train набора данных.

import keras
from keras.models import Sequential
from keras.layers import Dense
from keras.wrappers.scikit_learn import KerasClassifier
from sklearn.model_selection import cross_val_score

def build_classifier():
    classifier = Sequential()
    classifier.add(Dense(units = 16, kernel_initializer = 'uniform', activation = 'relu', input_dim = 30))
    classifier.add(Dense(units = 16, kernel_initializer = 'uniform', activation = 'relu'))
    classifier.add(Dense(units = 1, kernel_initializer = 'uniform', activation = 'sigmoid'))
    classifier.compile(optimizer = 'rmsprop', loss = 'binary_crossentropy', metrics = ['accuracy'])
    return classifier

classifier = KerasClassifier(build_fn = build_classifier, batch_size=25, epochs = 10)

results = cross_val_score(classifier, X_train, y_train, cv=10, n_jobs=-1)

Вывод Iget is Epoch 1/1 повторяется 4 раза (у меня 4 ядра) и ничего больше, потому что после этого он зависает и вычисление никогда не заканчивается.Я протестировал n_jobs = -1 с любыми другими алгоритмами Scikit-learn, и он отлично работает.Я не использую GPU, только CPU.

Чтобы проверить код, просто добавьте следующий нормализованный набор данных:

from sklearn.datasets import load_breast_cancer
data = load_breast_cancer()
df = pd.DataFrame(data['data'])
target = pd.DataFrame(data['target'])

from sklearn.model_selection import train_test_split
X_train, X_test, y_train, y_test = train_test_split(df, target, test_size = 0.2, random_state = 0)

# Feature Scaling
from sklearn.preprocessing import StandardScaler 
sc = StandardScaler()
X_train = sc.fit_transform(X_train)
X_test = sc.transform(X_test)

После игры с n_jobs (установите 1,2,3или -1) я получаю некоторые странные результаты, например, Epoch 1/1 повторяется только 3 раза вместо 4 (даже с n_jobs = -1) или когда я прерываю ядро, вот что я получаю:

Process ForkPoolWorker-33:
Traceback (most recent call last):
  File "/home/myname/anaconda3/lib/python3.6/multiprocessing/process.py", line 258, in _bootstrap
self.run()
  File "/home/myname/anaconda3/lib/python3.6/multiprocessing/process.py", line 93, in run
self._target(*self._args, **self._kwargs)
  File "/home/myname/anaconda3/lib/python3.6/multiprocessing/pool.py", line 108, in worker
task = get()
  File "/home/myname/anaconda3/lib/python3.6/site-packages/sklearn/externals/joblib/pool.py", line 362, in get
return recv()
  File "/home/myname/anaconda3/lib/python3.6/multiprocessing/connection.py", line 250, in recv
buf = self._recv_bytes()
  File "/home/myname/anaconda3/lib/python3.6/multiprocessing/connection.py", line 407, in _recv_bytes
buf = self._recv(4)
  File "/home/myname/anaconda3/lib/python3.6/multiprocessing/connection.py", line 379, in _recv
chunk = read(handle, remaining)
KeyboardInterrupt

Это может быть что-то в многопроцессорной обработке, но я не знаю, как это исправить.

Ответы [ 2 ]

0 голосов
/ 17 декабря 2018

Я переключился на версию sklearn = 0.20.1

Теперь проблема n_jobs «работает», поскольку команда запускается и завершается за более короткое время, чем n_jobs = 1.

Тем не менее:

1) Нет заметного улучшения во времени вычислений для n_jobs = 2 или выше

2) В некоторых случаях я получаю это предупреждение:

[Parallel(n_jobs=-1)]: Using backend LokyBackend with 2 concurrent workers.
/home/my_name/anaconda3/lib/python3.6/site-packages/sklearn/externals/joblib/externals/loky/process_executor.py:706: 
UserWarning: A worker stopped while some jobs were given to the executor. 
This can be caused by a too short worker timeout or by a memory leak.
  "timeout or by a memory leak.", UserWarning

И последнее замечание:интерактивные вычисления нейронной сети с эпохами больше не показывались для n_jobs! = 1 в записной книжке Jupyter, но в терминале (!?)

0 голосов
/ 08 декабря 2018

Приведенный выше код отлично работает для меня.Пожалуйста, обновите ваши модули.

шаг 1) установка в пипсах - обновление тензор потока

шаг 2) установка в пипсах keras

Я попытался, и он работает с использованием TensorFlow Backend.

У меня есть:

В [7]: sklearn. версия Вне [7]: '0.19.1'

В [8]: керас. версия Вне [8]:' 2.2.4 '

И:

import keras

/ anaconda2 / lib / python2.7 / site-packages / h5py / init .py: 36: FutureWarning: преобразование второго аргумента issubdtype из float в np.floating устарело,В дальнейшем это будет рассматриваться как np.float64 == np.dtype(float).type.из ._conv импортировать register_converters как _register_converters

Использование бэкэнда TensorFlow.

enter image description here

...