【问题标题】:Scikit-learn and keras multicore command n_jobs = -1Scikit-learn 和 keras 多核命令 n_jobs = -1
【发布时间】:2019-05-09 14:07:20
【问题描述】:

我刚刚使用 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)

我得到的输出是 Epoch 1/1 重复 4 次(我有 4 个核心),没有别的,因为之后它卡住并且计算永远不会完成。 我用任何其他 Scikit-learn 算法测试了 n_jobs = -1,它运行良好。我没有使用 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

这可能是多处理中的问题,但我不知道如何解决。

【问题讨论】:

  • 在这里查看我的答案:stackoverflow.com/a/44985898/5025009 并确保使用 Theano 后端。
  • 它不起作用。顺便说一句,我还是想用 Tensorflow 后端,而且我用的不是 Spyder,而是 Jupyter notebook
  • 你能添加一些数据来运行你的代码吗?
  • 是的,我刚刚用一些代码编辑了我的问题来测试数据集

标签: parallel-processing scikit-learn keras jupyter-notebook multicore


【解决方案1】:

我切换到 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

最后一句话:神经网络的交互式计算在 Jupyter notebook 中不再显示 n_jobs != 1 了,而是在终端中显示 (!?)

【讨论】:

    【解决方案2】:

    上面的代码对我来说很好用。请升级您的模块。

    步骤 1) pip install --upgrade tensorflow

    第 2 步)pip install keras

    我试过了,它使用 TensorFlow 后端工作。

    我有:

    In [7]:sklearn.版本 Out[7]:'0.19.1'

    输入[8]:keras。版本输出[8]:'2.2.4'

    还有:

    import keras
    

    /anaconda2/lib/python2.7/site-packages/h5py/init.py:36: FutureWarning: issubdtype 的第二个参数从 floatnp.floating 已弃用。以后会处理的 作为np.float64 == np.dtype(float).type。从 ._conv 导入 register_converters 作为 _register_converters

    使用 TensorFlow 后端。

    【讨论】:

    • 一切都是最新的,tensorflow 1.12.0,keras 2.2.4,scikit-learn 0.19.2。并且仍然让 Epoch 1/1 重复四次,没有别的。如何检查我的核心的健康状况?
    • 只是说它变得相当奇怪:在重新运行相同的代码并使用 n_jobs(=1,2,3 或 -1)后,输出有时是 Epoch 1/1 仅 3 次(甚至如果 n_jobs 是 -1!),有时它会在完成一个 epoch 之前拆分训练数据集......当我中断内核时,我会在我的问题中写入输出
    猜你喜欢
    • 2017-12-08
    • 1970-01-01
    • 2018-05-11
    • 2018-09-07
    • 1970-01-01
    • 2020-03-26
    • 1970-01-01
    • 2020-09-30
    • 1970-01-01
    相关资源
    最近更新 更多