web-dev-qa-db-fra.com

Implémenter le dérivé Relu dans python numpy

J'essaie d'implémenter une fonction qui calcule la dérivée Relu pour chaque élément d'une matrice, puis renvoie le résultat dans une matrice. J'utilise Python et Numpy.

Sur la base d'autres publications de validation croisée, la dérivée Relu pour x est 1 lorsque x> 0, 0 lorsque x <0, non défini ou 0 lorsque x == 0

Actuellement, j'ai le code suivant jusqu'à présent:

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

Malheureusement, xi est un tableau car x est une matrice. La fonction reluDerivativeSingleElement ne fonctionne pas sur le tableau. Je me demande donc s'il existe un moyen de mapper les valeurs d'une matrice à une autre matrice en utilisant numpy, comme la fonction exp dans numpy?

Merci beaucoup d'avance.

7
Bon

Je suppose que c'est ce que vous recherchez:

>>> 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.]])
10
Irshad Bhat

C'est un exercice de vectorisation.

Ce code

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

Peut être reformulé en

y = (x > 0) * 1

C'est quelque chose qui fonctionnera pour les tableaux numpy, car les expressions booléennes les impliquant sont transformées en tableaux de valeurs de ces expressions pour les éléments dudit tableau.

13
Jakub Bartczuk

La fonction de base pour renvoyer la dérivée de relu pourrait être résumée comme suit:

f'(x) = x > 0

Donc, avec numpy ce serait:

def relu_derivative(z):
    return np.greater(z, 0).astype(int)
6
milosdju
def dRelu(z):
    return np.where(z <= 0, 0, 1)

Ici z est un ndarray dans mon cas.

3
Krishna Mishra

Comme mentionné par Neil dans les commentaires, vous pouvez utiliser la fonction heaviside de numpy.

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

Vous êtes sur la bonne voie: penser à l'opération vectorisée. Où nous définissons une fonction, et nous appliquons cette fonction à une matrice, au lieu d'écrire une boucle for.

Ce fil répond à votre question, où il remplace tous les éléments remplissent la condition. Vous pouvez le modifier en dérivé ReLU.

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

De plus, python supporte très bien la programmation fonctionnelle, essayez d'utiliser la fonction lambda.

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

0
hxd1011

Si vous souhaitez utiliser du Python pur:

def relu_derivative(x):
    return max(sign(x), 0)
0
Kirill Dolmatov

Cela marche:

def dReLU(x):
    return 1. * (x > 0)
0
Shital Shah
def reluDerivative(self, x): 
    return 1 * (x > 0)
0
user3503711