【问题标题】:Faster implementation for ReLu derivative in python?在 python 中更快地实现 ReLu 导数?
【发布时间】:2019-07-24 22:22:00
【问题描述】:

我已将 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)。 但是计算需要很多时间。有没有其他优化方案?

【问题讨论】:

    标签: python numpy machine-learning deep-learning activation-function


    【解决方案1】:

    方法#1:使用numexpr

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

    (X>=0)+0
    

    因此,要解决我们的问题,应该是 -

    import numexpr as ne
    
    ne.evaluate('(X>=0)+0')
    

    方法 #2:使用 NumPy views

    另一个技巧是通过将比较掩码查看为int 数组来使用views,就像这样 -

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

    在性能上,应该和创建X&gt;=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
    

    【讨论】:

    • 很好的答案(+1,当然删除了我自己的,尽管已经投票了)
    猜你喜欢
    • 2018-03-06
    • 2018-06-14
    • 2012-10-18
    • 2015-11-13
    • 2010-12-17
    • 1970-01-01
    • 2021-01-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多