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