gpt4 book ai didi

python - 在 python 中更快地实现 ReLu 导数?

转载 作者:行者123 更新时间:2023-11-28 22:12:21 24 4
gpt4 key购买 nike

我已将 ReLu 导数实现为:

def relu_derivative(x):
return (x>0)*np.ones(x.shape)

我也尝试过:

def relu_derivative(x):
x[x>=0]=1
x[x<0]=0
return x

X 的大小=(3072,10000)。但计算需要花费很多时间。还有其他优化方案吗?

最佳答案

方法#1:使用numexpr

处理大数据时,我们可以使用 numexpr module如果预期的操作可以表示为算术操作,则支持多核处理。在这里,一种方法是 -

(X>=0)+0

因此,要解决我们的问题,那就是 -

import numexpr as ne

ne.evaluate('(X>=0)+0')

方法#2:使用 NumPy View

另一个技巧是通过将比较掩码视为 int 数组来使用 views,如下所示 -

(X>=0).view('i1')

就性能而言,它应该与创建 X>=0 相同。

时间

比较随机数组上所有已发布的解决方案 -

In [14]: np.random.seed(0)
...: X = np.random.randn(3072,10000)

In [15]: # OP's soln-1
...: def relu_derivative_v1(x):
...: return (x>0)*np.ones(x.shape)
...:
...: # OP's soln-2
...: def relu_derivative_v2(x):
...: x[x>=0]=1
...: x[x<0]=0
...: return x

In [16]: %timeit ne.evaluate('(X>=0)+0')
10 loops, best of 3: 27.8 ms per loop

In [17]: %timeit (X>=0).view('i1')
100 loops, best of 3: 19.3 ms per loop

In [18]: %timeit relu_derivative_v1(X)
1 loop, best of 3: 269 ms per loop

In [19]: %timeit relu_derivative_v2(X)
1 loop, best of 3: 89.5 ms per loop

基于 numexpr 的线程具有 8 线程。因此,随着更多数量的线程可用于计算,它应该会进一步改进。 Related post关于如何控制多核功能。

方法#3:方法#1 + #2 -

将两者混合以获得大型阵列的最佳方案 -

In [27]: np.random.seed(0)
...: X = np.random.randn(3072,10000)

In [28]: %timeit ne.evaluate('X>=0').view('i1')
100 loops, best of 3: 14.7 ms per loop

关于python - 在 python 中更快地实现 ReLu 导数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54969120/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com