我已经将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=(307210000)。
但计算起来要花很多时间。还有其他的优化方案吗?

最佳答案

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

(X>=0)+0

因此,要解决我们的案子-
import numexpr as ne

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

方法2:使用NumPyviews
另一个技巧是使用views将比较掩码视为int数组,如下所示-
(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/

10-12 18:50