ReLU Prime与NumPy阵列

时间:2017-07-10 21:32:20

标签: python arrays numpy

我想将多维数组传递到 relu prime函数

def reluprime(x):
    if x > 0:
        return 1
    else:
        return 0

... x是整个数组。它返回

  

ValueError:具有多个元素的数组的真值是不明确的。使用a.any()或a.all()

我在普通的relu函数中遇到了这个问题,而不是使用python函数max()我使用np.max()并且它有效。但是对于relu prime,它无论如何都无法正常工作。我试过了:

def reluprime(x):
    if np.greater(x, 0):
        return 1
    else:
        return 0

...它仍然返回相同的错误。我怎样才能解决这个问题?谢谢。

3 个答案:

答案 0 :(得分:6)

因为如果向量中的条目大于0则relu prime返回1,否则返回0,你可以这样做:

def reluprime(x):
    return (x>0).astype(x.dtype)

在上面的代码中,输入数组x被假定为numpy数组。 例如,reluprime(np.array([-1,1,2]))会返回array([0, 1, 1])

答案 1 :(得分:5)

if语句没有意义,因为它只对整个数组进行一次计算。如果你想要为数组的每个元素等效if语句,你应该做类似的事情:

def reluprime(x):
    return np.where(x > 0, 1.0, 0.0)

答案 2 :(得分:4)

" relu prime"或ReLU功能的梯度更好地称为" heavyiside step function"。

Numpy 1.13为此引入了ufunc

def reluprime(x):
    return np.heaviside(x, 0)
    # second value is value at x == 0
    # note that ReLU is not differentiable at x==0, so there is no right value to
    # pass here

我的机器上的计时结果表明这个表现非常糟糕,这表明需要做更多的工作:

In [1]: x = np.random.randn(100000)

In [2]: %timeit np.heaviside(x, 0)  #mine
1.31 ms ± 58.3 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)

In [3]: %timeit np.where(x > 0, 1.0, 0.0)  # Jonas Adler's
658 µs ± 74.2 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)

In [4]: %timeit (x>0).astype(x.dtype)  # Miriam Farber's
172 µs ± 34.8 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)