2017-12-24 9 views
0

フィーチャを計算してフィーチャに保存する機能があります。機能においてPickle TypeError inside numpy.save()

test_knn_feats = NNF.predict(X_test) 
np.save('data/knn_feats_%s_test.npy' % metric , test_knn_feats) 

n_jobsが1以上であれば、次に以下のコードは実行されます。

fest_feats =[] 
pool = Pool(processes = self.n_jobs) 
for i in range(X.shape[0]): 
    test_feats.append(pool.apply_async(self.get_features_for_one(X[i:i+1]))) 
pool.close() 
pool.join() 

return np.vstack(test_feats) 

しかし、エラーが発生している:

TypeError         Traceback (most recent call last) 
<ipython-input-96-4f707b7cd533> in <module>() 
    12  print(test_knn_feats) 
    13  # Dump the features to disk 
---> 14  np.save('data/knn_feats_%s_test.npy' % metric , test_knn_feats) 

/opt/conda/lib/python3.6/site-packages/numpy/lib/npyio.py in save(file, arr, allow_pickle, fix_imports) 
    507   arr = np.asanyarray(arr) 
    508   format.write_array(fid, arr, allow_pickle=allow_pickle, 
--> 509       pickle_kwargs=pickle_kwargs) 
    510  finally: 
    511   if own_fid: 

/opt/conda/lib/python3.6/site-packages/numpy/lib/format.py in write_array(fp, array, version, allow_pickle, pickle_kwargs) 
    574   if pickle_kwargs is None: 
    575    pickle_kwargs = {} 
--> 576   pickle.dump(array, fp, protocol=2, **pickle_kwargs) 
    577  elif array.flags.f_contiguous and not array.flags.c_contiguous: 
    578   if isfileobj(fp): 

機能get_features_for_oneは、以下に示すリストは、返されます。

... 
knn_feats = np.hstack(return_list) 
assert knn_feats.shape == (239,) or knn_feats.shape == (239, 1) 
return knn_feats 

*更新:

test_feats =[]  
pool = Pool(processes = self.n_jobs) 
for i in range(X.shape[0]): 
    test_feats.append(pool.apply_async(self.get_features_for_one, (X[i:i+1],))) 
test_feats= [res.get() for res in test_feats]   
pool.close() 
pool.join() 
return np.vstack(test_feats) 
+0

保存する前に 'test_knn_feats.dtype'とは何ですか?マルチスレッドとは何が関係していますか?マルチスレッド化せずに実行するとコードが動作すると言っていますか? –

+0

私はそれを印刷するとき、それが表示されます。<0x7f1bb03ae5c0でmultiprocessing.pool.ApplyResultオブジェクト> [[<0x7f1bb02fe240でmultiprocessing.pool.ApplyResultオブジェクト> [] [<0x7f1bb02fe2b0でmultiprocessing.pool.ApplyResultオブジェクト>] ...、 [<0x7f1bb17b62b0でmultiprocessing.pool.ApplyResultオブジェクト>] [<0x7f1bb17b63c8でmultiprocessing.pool.ApplyResultオブジェクト>] [<0x7f1bb17b6518でmultiprocessing.pool.ApplyResultオブジェクト>]] –

+0

は、それが 'ある@JohnZwinckオブジェクト 'dtype –

答えて

0

ここでは二つの主要なバグがあります。

test_feats =[] # you called it fest_feats, I assume a typo 
pool = Pool(processes = self.n_jobs) 
for i in range(X.shape[0]): 
    test_feats.append(pool.apply_async(self.get_features_for_one(X[i:i+1]))) 
    pool.close() 
    pool.join() 

return np.vstack(test_feats) 
  1. まず、あなたは、プールを作成します。その後、それぞれiに対して1つのジョブを送信してから、&を閉じてプールに参加します。 &を終了するのは、ループの外側で、最後に一度プールに参加するだけです。

  2. test_featsは、実際のデータではなく「未来」のリストになります。したがって、vstack()は意味をなさない。あなたはget_features_for_one()の結果を得るために、毎回get()に電話をかけてから、そのリストをvstack()に渡す必要があります。例えば、np.vstack([res.get() for res in test_feats])。要するに

、あなたの問題はあなたが最終的にnumpy.save()から受け取る--yourあなたのロジックは完全に破壊され、あなたのデータはあなたはそれが何を考えていないされていることに問題があるTypeError例外とは何の関係もありません。

+0

ああ最初のポイントのコピー&ペーストミスがあります。ループの外でプールを閉じて参加します。私は2点目で試してみます。 –

+0

'test_feats = [res in test_feats]'で試しました。 'TypeError: 'numpy.ndarray'オブジェクトが呼び出せません 'というエラーメッセージが表示されたら、デバッグする時間がかかります –

+0

@MervynLee:投稿したコード以外のコードを実行しているので、新しいエラーが発生しています。あんな事はしないで。 –