2017-09-25 54 views
1

我试图实现一个函数,它计算矩阵中每个元素的Relu导数,然后将结果返回到矩阵中。我正在使用Python和Numpy。在python numpy中实现Relu派生

基于其它交叉验证帖,x的RELU衍生物是 1当x> 0时,0当x < 0,未定义或0当x == 0

目前,我有以下代码,以便远:

def reluDerivative(self, x): 
    return np.array([self.reluDerivativeSingleElement(xi) for xi in x]) 

def reluDerivativeSingleElement(self, xi): 
    if xi > 0: 
     return 1 
    elif xi <= 0: 
     return 0 

不幸的是,xi是一个数组,因为x是一个矩阵。 reluDerivativeSingleElement函数不适用于数组。所以我想知道是否有一种方法可以使用numpy将矩阵中的值映射到另一个矩阵,就像numpy中的exp函数一样?

非常感谢。

+5

[np.heaviside(https://docs.scipy.org/doc/numpy/reference/generated/numpy.heaviside.html) –

回答

2

我想这是你在找什么:

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

>>> z = np.random.uniform(-1, 1, (3,3)) 
>>> z 
array([[ 0.41287266, -0.73082379, 0.78215209], 
     [ 0.76983443, 0.46052273, 0.4283139 ], 
     [-0.18905708, 0.57197116, 0.53226954]]) 
>>> reluDerivative(z) 
array([[ 1., 0., 1.], 
     [ 1., 1., 1.], 
     [ 0., 1., 1.]]) 
+0

谢谢,我做了x的副本,以便原始x不被修改。 – Bon

+0

@Bon,你为什么认为原来的x会被修改?我想,'x'是'reluDerivative'函数的局部变量,它不应该影响范围之外的'x',不是吗? –

+0

@RishabhAgrahari'x'将是一个numpy数组,通过引用传递,因此修改'reluDerivative'中的'x'将修改传递给函数 – Ron7

0

您现在处于一个很好的轨道:思考向量化操作。在我们定义一个函数的地方,我们将这个函数应用到一个矩阵,而不是写一个for循环。

此主题回答你的问题,它代替所有元素满足条件。您可以将其修改为ReLU衍生物。

https://stackoverflow.com/questions/19766757/replacing-numpy-elements-if-condition-is-met

此外,Python支持函数式编程得非常好,尽量使用lambda函数。

https://www.python-course.eu/lambda.php

3

这是在向量化的练习。

此代码

if x > 0: 
    y = 1 
elif xi <= 0: 
    y = 0 

可以重新进入

y = (x > 0) * 1 

这是后话,会为numpy的阵列的工作,因为它们涉及布尔表达式都变成这些表达式为元素的值的数组在所述阵列中。

+0

我把这个代码在我reluDerivativeSingleElement功能。它仍然说它不能使用数组。也许我错误地解释了你的答案? – Bon

+0

这没有多大意义 - 这个代码应该在整个数组上工作 –

+1

为什么不简单地'y =(x> 0)* 1.0'似乎产生与y =(x> 0)* 1相同的结果+(x <= 0)* 0' – Bill

3

基本函数返回衍生RELU的可以总结如下:

f'(x) = x > 0 

所以,用numpy的,这将是:

def relu_derivative(z): 
    return np.greater(z, 0).astype(int) 
-1

当x大于0时,斜率为1. 当x小于或等于等于0,斜率为0。

if (x > 0): 
    return 1 
if (x <= 0): 
    return 0 

这可以写成更为紧凑:

return 1 * (x > 0) 
+0

这并没有回答这个问题,尽管更紧凑的可读性较差。 – bphi

0

这工作:

def dReLU(x): 
    return 1. * (x > 0) 
0

正如意见中提到的尼尔,你可以使用numpy的的heaviside功能。

def reluDerivative(self, x): 
    return np.heaviside(x, 0)