我想将多维数组传递到 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
...它仍然返回相同的错误。我怎样才能解决这个问题?谢谢。
答案 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)