2017-10-14 127 views
0

我有一個3D腦圖像矩陣數組,我正在爲這些圖像做一些處理。joblib.Parallel同時處理相同的數據集多次而不是不同的集

輸入矩陣看起來像M [X,Y]:其中X是大腦ID和Y是我後來重新塑造它來作一些改進的

以下順序代碼數據做到完美:

def transform(X): 
data = np.reshape(X, (-1, 176, 208, 176)) 
data_cropped = np.empty((data.shape[0], 90, 100, 70)) 
for idx in range(0, data.shape[0]): 
    data_cropped[idx, :, :, :] = data[idx, 40:130, 40:140, 50:120] 

data_cropped = perm(data_cropped) 
#data_cropped = impute_data(data_cropped) 
data_cropped = np.reshape(data_cropped, (data_cropped.shape[0], -1)) 
#data_cropped = data_cropped[:, np.apply_along_axis(np.count_nonzero, 0, data_cropped) != 0] 

return data_cropped 


X_train = np.load("./data_original/X_train.npy") 
X_crop = transform(X_train) 

順序(正常for循環)運行時,該代碼部分的輸出是:

腦:0

腦:1

大腦:2

大腦:3

...

的問題是,它需要很長的時間(大約60分鐘)來處理所有的大腦。

我試圖讓代碼並行運行,但我無法處理所有的大腦!只有腦0正在被多次處理。

還有就是我嘗試並行代碼:

num_cores = multiprocessing.cpu_count() 
X_train = np.load("./data_original/X_train.npy") 
X_crop = Parallel(n_jobs=num_cores)(delayed(transform)(i) for i in X_train) 

但我得到了這樣的結果:

大腦:0

大腦:0

大腦:0

腦:0

...

任何想法如何解決這個問題? 感謝

+0

您確定處理了同一組數據嗎?生成的「brain:」這一行中的數字如何? –

+0

是的,每個大腦都有相同的數據,這意味着如果我做X_train.shape然後我會得到278,6443008 – Kal

+0

我認爲這個問題是在這個聲明中,但我不知道如何解決它:Parallel(n_jobs = num_cores) (對於X_train中的i,延遲(變換)(i)) – Kal

回答

0

您需要

  • 作業之間恰當地劃分您的數據
  • 提供您的工作人員的代碼信息來正確顯示生產指數的大腦。

for i in X_train在一個時間產生的X_train行(沿第一維度),一,並且它們具有一個尺寸小於初始陣列:

In [7]: a=np.random.random((2,10)) 

In [10]: a.shape 
Out[10]: (2, 10) 

In [11]: [i.shape for i in a] 
Out[11]: [(10,), (10,)] 

由於你沒有給所有示例代碼重現問題,我不能說你的處理代碼期望什麼形狀。


然後,顯然,「brain:」之後的數字是輸入行中的索引。如果您將每個作業作爲輸入數組的一部分,那麼它們自然會產生相同的索引。你需要以某種方式告訴每個工作它的凝視索引,以便他們正確地計算絕對索引。