2017-10-14 4 views
0

私はこれらの画像に対して何らかの処理をしている3D脳画像のマトリックス配列を持っています。 Xは、脳のIDで、Yは、私がjoblib.Parallelは、異なるセットではなく、同じデータセットを複数回処理します。

次のシーケンシャルコードのためのいくつかの機能拡張を作るために、後でそれを再構築していたデータである完全にそれを行う:

入力行列は、M [X、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

...

どのようにこの問題を解決するか? おかげで

+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の行を1つずつ生成し、そして、彼らは最初の配列未満つの次元があります:あなたは与えていないので

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:」の後の数字は、入力内の行のインデックスです。各ジョブに入力配列の一部を供給すると、当然、それらはすべて同じインデックスを生成します。それぞれの仕事について、どのようにして起点索引を指示して、絶対索引を正しく計算する必要があります。

関連する問題