Windows10 上的 cross_val_score,并行计算错误

Posted

技术标签:

【中文标题】Windows10 上的 cross_val_score,并行计算错误【英文标题】:cross_val_score on Windows10, error with parallel-computing 【发布时间】:2017-12-12 10:28:35 【问题描述】:

当我尝试在 n_job 不等于 1 的情况下使用 cross_val_score 时遇到错误。

我的系统是 Intel-i7 cpu,Windows10,python3.6,Spyder。

下面是我的代码:

from numpy.random import randn
import pandas as pd
from keras.wrappers.scikit_learn import KerasClassifier
from sklearn.model_selection import cross_val_score
from keras.models import Sequential
from keras.layers import Dense

# build a data set
dataset = pd.DataFrame(randn(100, 2), columns='X1 X2'.split())
dataset["Y"]=dataset["X1"]+dataset["X2"]

# seperate X and y
X = dataset.iloc[:, 0:2].values
Y = dataset.iloc[:, 2].values

# define classifier
def build_classifier():
    classifier = Sequential()
    classifier.add(Dense(units = 2, kernel_initializer = 'uniform', activation = 'relu', input_dim = 2))
    classifier.add(Dense(units = 1, kernel_initializer = 'uniform', activation = 'sigmoid'))
    classifier.compile(optimizer = 'adam', loss = 'binary_crossentropy', metrics = ['accuracy'])
    return classifier
classifier = KerasClassifier(build_fn = build_classifier, batch_size = 1, epochs = 4)

class testnjob():
    def run():
        accuracies = cross_val_score(estimator = classifier, X = X, y = Y, cv = 5, n_jobs = -1)
        return(accuracies)
if __name__ == '__main__':
    accuracies = testnjob.run()

错误信息是:

ImportError: [joblib] Attempting to do parallel computing without protecting
your import on a system that does not support forking. To use parallel-
computing in a script, you must protect your main loop using
"if __name__ == '__main__'". Please see the joblib documentation on Parallel
for more information

如果我设置 n_jobs=1,代码就可以工作。

有没有办法解决这个问题?

补充:代码在linux虚拟机上运行。我在 Virtualbox、anaconda(python 3.6)+ spyder(Tensorflow 后端)上尝试了 Ubuntu。

补充:我在pycharm中尝试了同样的代码,出现了不同的错误信息:

AttributeError: Can't get attribute 'build_classifier' on
<module '__main__' (built-in)>

谢谢!

【问题讨论】:

您能否提供一个迷你代码示例,以便可能的读者能够重现您的错误? 在 Linux 上你不应该有这个问题。我发布了一个可能的 windows 解决方案。 @sera 谢谢。我试过了,它可以在 Linux 上运行(我在 Virtualbox 上的 Ubuntu 上试过)。我暂时将其用作解决方案。 @WestYang 好的。但奇怪的是它在 pycharm 中对你不起作用。这对我来说可以。正如我告诉你的,我使用 Windows 8 和 sklearn 0.18 和 Theano 后端。也许您可以尝试重新安装 sklearn 和 keras 并再次尝试我的解决方案 【参考方案1】:

你可以试试这个,因为你使用 spyder 应该可以正常工作:

代码

import...

Class Test(object):
    def __init__(self):
        accuracies = cross_val_score(estimator = classifier, X = X_train, y = y_train, cv = 10, n_jobs = -1)
        ###code here
        ###code here    

if __name__ == '__main__':
    Test()

希望这会有所帮助。

我在link 的帖子解决了与 spyder 和 n_jobs 类似的问题

编辑

我修改了你代码的最后一部分,它在 Windows 8.1 上运行良好。

另外,我使用:Theano 后端。

改动部分:

from numpy.random import randn
...
...
classifier = KerasClassifier(build_fn = build_classifier, batch_size = 1, epochs = 4)

####################################################################
#changed part from here

class run():
    def __init__(self):
        cross_val_score(estimator = classifier, X = X, y = Y, cv = 5, n_jobs = -1)


if __name__ == '__main__':
    run()

截图:

【讨论】:

class 对象是解决问题所必需的吗?为什么不把它包装在一个简单的方法上呢?此外,您应该在包装器中添加print(accurasies),否则您将不会收到任何输出。 @E.Z.这不是必需的,但这已经解决了 n_jobs 和 spyder 的类似问题。我认为值得一试。让我们等待提问者的反馈 @sera 我在 Spyder 中仍然看到同样的错误。我也在 pycharm 中尝试过,它产生了不同的错误消息,请参阅我编辑的帖子的底部。我编辑了你的代码给我回报,同时我也尝试了你的代码,它产生了与我相同的错误(在 Spyder/pycharm 中)。 @WestYang 我刚刚修改了你的一部分代码,它从控制台运行良好,并在 Windows 8 上使用 Pycharm。 @sera 我的笔记本电脑上仍然存在同样的问题。我正在使用 TensorFlow 后端。我试图将我的后端更改为 Theano,但我用 m2w64-toolchain 解决了进一步的错误......我猜 Tensorflow 后端可能是导致问题的原因。如果可能的话,你能不能切换到 Tensorflow 后端,看看你是否会得到错误?谢谢!

以上是关于Windows10 上的 cross_val_score,并行计算错误的主要内容,如果未能解决你的问题,请参考以下文章

如何从 Windows 10 上的容器连接到 docker 主机(Docker for Windows)

Windows 10 上的 XAMPP 和 Skype 端口冲突

Windows 10 上的 Bash 和 Ubuntu 终端有啥区别

在 Windows 10 上的 WSL2 上使用 JDK 的正确方法是啥?

异常退出:Windows 10 上的 eaccess

Windows 10 上的环境变量太大