2

我有两个 dask 数组,即 a 和 b。我得到a和b的点积如下

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

但是当我这样做时

sigmoid(z2)

壳牌停止工作。我什至不能杀死它。Sigmoid 如下所示:

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

2 回答 2

2

使用 Dask Arrays 时,通常最好使用dask.array. 直接使用 NumPy 函数的问题是它们会将数据从 Dask Array 提取到内存中,这可能是您遇到的 shell 冻结的原因。中提供的函数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 ]])
于 2017-06-10T21:41:20.353 回答
2

明白了...我试过了,它奏效了!

ans = z2.map_blocks(sigmoid)
于 2016-03-26T11:26:16.717 回答