2016-03-23 9 views
0

私は入力配列がhdf5配列Xであり、重み行列がW1であるニューラルネットワークを作っています。私はこれら2つのドットプロダクトを以下のようにして、他のhdf5配列でストロングしようとしています。hdf5配列のドットプロダクト

f = h5py.File('z2.hdf5') 
self.f['z2'] = np.dot(X,self.W1) 

しかし、上記の行で私にMemoryErrorが返されます。どのようにそれを解決するには? hdf5配列のドット積を実行するには? http://dask.pydata.org/en/latest/array-overview.html

から

+0

あなたのデータがどのように大きな理解し、それは本当にメモリに収まらない場合は、それがメモリに収まるdask.pydata.org – kakk11

+0

ような何かを試してみてください。問題はnp.dot()です。巨大な配列を扱うことはできません。 XがいくつかのGBsのサイズが非常に大きい場合、np.transpose(X)も動作しません@ kakk11 – Kavan

+0

配列の大きさは、明らかにnp.dotが新しい行列を作成し、より多くのメモリを要求します。 – kakk11

答えて

2

「が」 "DASKアレイは多数の小さなアレイに大きな配列を切断する、ブロックされたアルゴリズムを使用してnumpyのndarrayインターフェースのサブセットを実装しています。これは、私たちのすべてを使用してメモリより大きなアレイに計算することができコア "" "

そして

""" dask.arrayライブラリはnumpyのから次のインターフェイスをサポートしています。

...

テンソル収縮/内積/行列乗算、説明のためtensordot「」」

実施例、DASK VS numpyの性能を確認するために異なる寸法を試みます。

import dask as dk 
import tables 
import numpy as np 
from time import time 

outpath = "/tmp/" 
lenx = 300 
leny = 100000 
fname = "t{0:03d}_{1:03d}.h5".format(int(lenx/100),int(leny/100)) 

def write_test_file(): 
    h5file = tables.open_file(outpath+fname,"w") 
    pres = np.random.random((lenx,leny)) 
    atom = tables.Float64Atom() 
    filters = tables.Filters(complevel=6, complib='zlib', shuffle=True) 
    print("Writing data") 
    t01 = time() 
    h5file.create_carray(h5file.root,'pressure',atom,(lenx,leny),filters=filters,obj=pres) 
    h5file.flush() 
    del pres 
    t02 = time() 
    lines = np.random.random((leny,lenx)) 
    h5file.create_carray(h5file.root,"lines",atom,(leny,lenx),filters=filters,obj=lines) 
    t03 = time() 
    print("Data written",t03-t02,t02-t01) 
    h5file.close() 

def numpy_dot_test(): 
    print("Open data") 
    t1 = time() 
    h5open = tables.open_file(outpath+fname,mode="r") 
    pressureObject = h5open.get_node("/", "pressure") 
    print(pressureObject.shape) 
    linesObject=h5open.get_node("/","lines") 
    print(linesObject.shape) 
    t2 = time() 
    ohoo = np.array(linesObject).dot(np.array(pressureObject)) 
    t3 = time() 
    print(ohoo.shape,np.mean(ohoo)) 
    print("matmul time:",t3-t2,t2-t1) 
    h5open.close() 

def dask_dot_test(): 
    import h5py 
    import dask.array as da 
    h5open2 = h5py.File(outpath+fname) 
    t21=time() 
    d1=da.from_array(h5open2["/pressure"],chunks=(100,lenx)) 
    d2=da.from_array(h5open2["/lines"],chunks=(leny,100)) 
    t22=time() 
    print('d1,d2',d1.shape,d2.shape) 
    d1.dot(d2).to_hdf5(outpath+'output.h5','testout') 
    t23=time() 
    print('ohoo',t23-t22,t22-t21) 
    h5open2.close() 


write_test_file() 
    ## numpy_dot_test() 
dask_dot_test() 
+0

私は1.2 GBのXと7500 x 10マトリックスのようなwを持っています。私はドットプロダクトをしようとしています。つまり、f ['z2'] = X.dot(w)です。ここで何が問題なの?計算時間はチャンクと何か関係がありますか? @ kakk11 – Kavan

+0

はい、チャンクが重要です。私はdaskを使用した実例を追加しました。それが役立つかどうかを見てください。そうでない場合は、あなたのコードをもっと分けてください。 – kakk11

+0

私は初心者であり、あなたの例では多くの機能が不明です。しかし、私は "dask_array.compute()"で立ち往生しています。それは動作していないとそれはシェルを凍結し、私はそれを殺すこともできません。あなたは私のコードを表示することができますか? – Kavan

関連する問題