joblib.Parallel多次处理同一组数据而不是不同的集合

时间:2017-10-14 09:28:12

标签: python python-3.x numpy joblib

我有一个3D脑图像的矩阵阵列,我正在对这些图像进行一些处理。

输入矩阵看起来像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)

顺序运行时此代码部分的输出(循环正常)为:

大脑: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

...

知道如何解决这个问题吗? 感谢

1 个答案:

答案 0 :(得分:0)

你需要

  • 在作业AND
  • 之间适当地分割数据
  • 为您的员工代码提供正确生成显示的大脑指数的信息。

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,)]

由于您没有提供所有示例代码来重现问题,因此我无法说出您的处理代码所期望的形状。

然后,显然,"大脑之后的数字:"是输入中行的索引。如果你为每个作业提供输入数组的一部分,那么它们都会产生相同的索引。你需要以某种方式告诉每个工作它的凝视指数,以便他们正确计算绝对指数。