Machine learning 在python numpy中实现Relu派生
我试图实现一个函数,计算矩阵中每个元素的Relu导数,然后在矩阵中返回结果。我正在使用Python和Numpy 根据其他交叉验证帖子,x的Relu导数为 当x>0时为1,当x<0时为0,未定义或当x==0时为0 目前,我有以下代码:Machine learning 在python numpy中实现Relu派生,machine-learning,python,derivative,numpy,Machine Learning,Python,Derivative,Numpy,我试图实现一个函数,计算矩阵中每个元素的Relu导数,然后在矩阵中返回结果。我正在使用Python和Numpy 根据其他交叉验证帖子,x的Relu导数为 当x>0时为1,当x 0: 返回1 伊利夫·席普:你的轨道很好:思考矢量化操作。我们定义了一个函数,并将这个函数应用于矩阵,而不是编写for循环 这个线程回答了您的问题,它替换了满足条件的所有元素。您可以将其修改为ReLU导数 另外,python非常支持函数式编程,尝试使用lambda函数 这是矢量化的练习 此代码 if 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
def reluDerivative(self,x):
返回NP.数组(席席的XI)
def reluDerivativeSingleElement(自身,xi):
如果席> 0:
返回1
伊利夫·席普:你的轨道很好:思考矢量化操作。我们定义了一个函数,并将这个函数应用于矩阵,而不是编写for循环
这个线程回答了您的问题,它替换了满足条件的所有元素。您可以将其修改为ReLU导数
另外,python非常支持函数式编程,尝试使用lambda函数
这是矢量化的练习
此代码
if x > 0:
y = 1
elif xi <= 0:
y = 0
这将适用于numpy数组,因为涉及它们的布尔表达式将转换为所述数组中元素的这些表达式的值数组。我猜这就是您要寻找的:
>>> 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.]])
>>def reluDerivative(x):
... x[x0]=1
... 返回x
>>>z=np.随机均匀(-1,1,(3,3))
>>>z
数组([[0.41287266,-0.73082379,0.78215209],
[ 0.76983443, 0.46052273, 0.4283139 ],
[-0.18905708, 0.57197116, 0.53226954]])
>>>重复竞争(z)
数组([[1,0,1.],
[ 1., 1., 1.],
[ 0., 1., 1.]])
返回relu导数的基本函数可以总结如下:
f'(x) = x > 0
因此,对于numpy,这将是:
def relu_derivative(z):
return np.greater(z, 0).astype(int)
当x大于0时,坡度为1。
当x小于或等于0时,坡度为0
if (x > 0):
return 1
if (x <= 0):
return 0
这项工作:
def dReLU(x):
return 1. * (x > 0)
正如Neil在评论中提到的,您可以使用numpy的函数
def reluDerivative(self, x):
return np.heaviside(x, 0)
def dRelu(z):
如果要使用纯Python,请返回np.where(z:
def relu_导数(x):
返回最大值(符号(x),0)
def reluDerivative(self,x):
返回1*(x>0)
谢谢,我复制了x,这样原始的x就不会被修改。@Bon,你为什么认为原始的x会被修改?我想,x
是reluDerivative
函数的局部变量,它不应该影响x
这个范围之外的,不是吗?@RishabhAgraharix
将是一个通过ref传递的numpy数组因此,在reludePrivative
中修改x
将修改传递到function@Bon谢谢。但是你怎么知道x
是通过引用传递的,这通常不会发生,对吗?只是想注意,从技术上来说,这只是自deriv以来众多编程解决方案中的一个ReLU的ative在0处未定义。因此,将此代码放在我的reluDerivativeSingleElement函数中,而不是x[xI。它仍然表示它不能与数组一起工作。也许我错误地解释了你的答案?这没有多大意义-此代码应该在整个数组上工作,而不仅仅是y=(x>0)*1.0
似乎产生了与y=(x>0)*1+(x)相同的结果,但这并不能回答问题,而且更紧凑的版本可读性较差。这似乎是该线程中提供的最快的实现。
def dReLU(x):
return 1. * (x > 0)
def reluDerivative(self, x):
return np.heaviside(x, 0)
def dRelu(z):
return np.where(z <= 0, 0, 1)