在 python numpy 中实现 Relu 导数

Implement Relu derivative in python numpy

我正在尝试实现一个函数,该函数计算矩阵中每个元素的 Relu 导数,然后 return 矩阵中的结果。我正在使用 Python 和 Numpy。

根据其他交叉验证帖子,x 的 Relu 导数是 当 x > 0 时为 1,当 x < 0 时为 0,未定义或当 x == 0

时为 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 函数一样?

非常感谢。

你的方向很好:考虑向量化运算。我们在这里定义一个函数,我们把这个函数应用到一个矩阵上,而不是写一个for循环。

本帖回答了你的问题,它替换了所有满足条件的元素。可以修改成ReLU导数。

另外,python对函数式编程的支持很好,尝试使用lambda函数

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

这是矢量化练习。

这个代码

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

可以改写成

y = (x > 0) * 1

这适用于 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.]])

relu的return导数的基本函数可以总结如下:

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

这样可以写得更紧凑:

return 1 * (x > 0)

这个有效:

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

正如 Neil 在评论中提到的,您可以使用 heaviside numpy 的功能。

def reluDerivative(self, x):
    return np.heaviside(x, 0)
def dRelu(z):
    return np.where(z <= 0, 0, 1)

在我的例子中,这里的 z 是一个 ndarray。

如果你想使用纯Python:

def relu_derivative(x):
    return max(sign(x), 0)
def reluDerivative(self, x): 
    return 1 * (x > 0)

如果你想要它的导数,你可以使用:

def relu(neta):
    relu = neta * (neta > 0)
    d_relu = (neta > 0)
    return relu, d_relu