2017-10-14 129 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:”之后的数字是输入行中的索引。如果您将每个作业作为输入数组的一部分,那么它们自然会产生相同的索引。你需要以某种方式告诉每个工作它的凝视索引,以便他们正确地计算绝对索引。