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

joblib.Parallel processes the same set of data multiple times instead of different sets

我有一个 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)

顺序运行时(正常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

...

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

你需要

  • 在作业之间适当地拆分数据 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,)]

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


那么,显然,"brain:" 之后的数字是输入中一行的索引。如果您为每个作业提供输入数组的一部分,自然地,它们都会产生相同的索引。您需要以某种方式告诉每个作业其起始索引,以便它们正确计算绝对索引。