Операции с массивами на массивах dask

У меня есть два массива dask, то есть, а и б. Я получаю точечное произведение А и В, как показано ниже

>>>z2 = da.from_array(a.dot(b),chunks=1)
>>> z2
dask.array<from-ar..., shape=(3, 3), dtype=int32, chunksize=(1, 1)>

Но, когда я делаю

sigmoid(z2)

Shell перестает работать. Я даже не могу убить это. Сигмоид дан как ниже:

def sigmoid(z):
        return 1/(1+np.exp(-z))

2 ответа

Решение

При работе с массивами Dask обычно лучше использовать функции, представленные в dask.array, Проблема с непосредственным использованием функций NumPy заключается в том, что они извлекают данные из массива Dask в память, что может быть причиной зависания оболочки, которое вы испытали. Функции, представленные в dask.array разработаны, чтобы избежать этого, лениво связывая вычисления, пока вы не захотите их оценить. В этом случае было бы лучше использовать da.exp вместо np.exp, Ниже приведен пример этого.

Предоставьте модифицированную версию вашего кода, чтобы продемонстрировать, как это будет сделано. В примере, который я назвал .compute(), который также тянет полный результат в память. Возможно, это также может вызвать проблемы для вас, если ваши данные очень большие. Поэтому я продемонстрировал, что перед вызовом вычисления нужно взять небольшой кусочек данных, чтобы сохранить небольшой размер и удобство использования памяти. Если ваши данные велики и вы хотите сохранить полный результат, рекомендую вместо этого сохранить их на диск.

Надеюсь это поможет.

In [1]: import dask.array as da

In [2]: def sigmoid(z):
   ...:     return 1 / (1 + da.exp(-z))
   ...: 

In [3]: d = da.random.uniform(-6, 6, (100, 110), chunks=(10, 11))

In [4]: ds = sigmoid(d)

In [5]: ds[:5, :6].compute()
Out[5]: 
array([[ 0.0067856 ,  0.31701817,  0.43301395,  0.23188129,  0.01530903,
         0.34420555],
       [ 0.24473798,  0.99594466,  0.9942868 ,  0.9947099 ,  0.98266004,
         0.99717379],
       [ 0.92617922,  0.17548207,  0.98363658,  0.01764361,  0.74843615,
         0.04628735],
       [ 0.99155315,  0.99447542,  0.99483032,  0.00380505,  0.0435369 ,
         0.01208241],
       [ 0.99640952,  0.99703901,  0.69332886,  0.97541982,  0.05356214,
         0.1869447 ]])

Понял... Я пытался, и это сработало!

ans = z2.map_blocks(sigmoid)
Другие вопросы по тегам