Точечное произведение массива hdf5

Я делаю нейронную сеть, входной массив которой представляет собой массив X hdf5, а матрица весов - W1. Я пытаюсь сделать точечный продукт этих 2, как показано ниже, и использовать его в другом массиве hdf5.

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

Но строка выше дает мне MemoryError. Как это решить? Как выполнить скалярное произведение массива hdf5?


person Kavan    schedule 23.03.2016    source источник
comment
Постарайтесь понять, насколько велики Ваши данные, и если они действительно не умещаются в памяти, попробуйте что-нибудь вроде dask.pydata.org   -  person kakk11    schedule 24.03.2016
comment
Умещается в памяти. Проблема с np.dot (). Он не может обрабатывать огромные массивы. np.transpose (X) также не работает, когда X очень велик по размеру некоторых ГБ @ kakk11   -  person Kavan    schedule 24.03.2016
comment
Насколько велики массивы, np.dot, очевидно, создает новую матрицу, таким образом запрашивая больше памяти ...   -  person kakk11    schedule 24.03.2016
comment
Это около 1,2 ГБ, и я храню его в массиве hdf5. Это мое расширение. Теперь, как мне вычислить его точечный продукт с другой матрицей? @ kakk11   -  person Kavan    schedule 24.03.2016


Ответы (1)


Из http://dask.pydata.org/en/latest/array-overview.html

"" "Dask Array реализует подмножество интерфейса NumPy ndarray с использованием заблокированных алгоритмов, разбивая большой массив на множество небольших массивов. Это позволяет нам выполнять вычисления на массивах, превышающих размер памяти, с использованием всех наших ядер." ""

А также

"" "Библиотека dask.array поддерживает следующий интерфейс от numpy:

...

Тензорные сокращения / скалярные произведения / матричное умножение, tensordot "" "

Рабочий пример для иллюстрации, попробуйте разные измерения, чтобы увидеть производительность numpy vs dask.

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()
person kakk11    schedule 24.03.2016
comment
Ну, у меня есть X размером 1,2 ГБ и размер матрицы 7500 x 10. Я пытаюсь выполнить точечный продукт, т.е. f ['z2'] = X.dot (w), и это заняло почти 1 час и не дало результата. В чем тут проблема? Имеет ли какое-либо отношение время вычислений к фрагментам? @ kakk11 - person Kavan; 25.03.2016
comment
Да, дробление важно. Я добавил рабочий пример использования dask, посмотрите, поможет ли он Вам, если нет, поделитесь, пожалуйста, своим кодом. - person kakk11; 26.03.2016
comment
Ну, я новичок, и мне неизвестны многие функции в вашем примере. Но, однако, я застрял в dask_array.compute (). Он не работает, и он замораживает оболочку, и я также не могу ее убить. Могу я показать код? - person Kavan; 26.03.2016
comment
Да, вы можете показать код. Одна из причин, по которой я знаю, почему команда compute может зависать, заключается в том, что она сначала создает слишком много вычислительных задач, а затем граф вычислений сводит ее с ума. Вероятно, вы можете избавиться от этого, изменив разбиение на части. - person kakk11; 27.03.2016
comment
Я получаю ошибку памяти с dask_array.compute (). Я поделился своим кодом здесь. Любой ваш совет или помощь будут оценены - person Kavan; 29.03.2016
comment
Я несколько раз убивал свой процесс с помощью приведенного выше кода; затем я изменил параметр chunks в определениях d1, d2 в dask_dot_test со 100 на 600, и он работал отлично. Спасибо! - person GianAnge; 24.03.2020