2017-07-08 81 views
3

,當我試圖用cross_val_scoren_job不等於1cross_val_score在Windows10,錯誤與並行計算

我的系統,我遇到了一個錯誤是Intel的i7處理器,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)> 

謝謝!

+0

你能爲了儘可能讀者能夠重現你的錯誤提供了一個小型的代碼樣本? –

+0

在Linux上,你不應該有這個問題。我發佈了一個可能的解決方案。 – sera

+0

@sera謝謝。我試過了,它可以在Linux上運行(我在Virtualbox上的Ubuntu上嘗試過)。我現在將此用作解決方案。 –

回答

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

希望這有助於。

與Spyder的和n_jobs類似的問題,我的帖子在這裏link

編輯

解決我修改你的代碼的最後一部分,它在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() 

截圖:

enter image description here

+0

是否需要克服該問題的'class'對象?爲什麼不把它包裝在一個簡單的方法?另外,您應該在包裝器中添加「print(accurasies)」,否則您將不會收到任何輸出。 –

+0

@ E.Z。這不是必須的,但是這已經解決了n_jobs和spyder的類似問題。我認爲這是值得try.lets等待誰提問 – sera

+0

@ sera的人的反饋我仍然在Spyder中看到同樣的錯誤。我也嘗試了pycharm,它產生了一個不同的錯誤信息,請參閱我編輯過的帖子的底部。我編輯你的代碼給我返回,而我也試過你的代碼,這產生了和我一樣的錯誤(在Spyder/pycharm中)。 –