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.
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.]])
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.
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)
def dRelu(z):
return np.where(z <= 0, 0, 1)
Ici z est un ndarray dans mon cas.
Comme mentionné par Neil dans les commentaires, vous pouvez utiliser la fonction heaviside de numpy.
def reluDerivative(self, x):
return np.heaviside(x, 0)
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.
Si vous souhaitez utiliser du Python pur:
def relu_derivative(x):
return max(sign(x), 0)
Cela marche:
def dReLU(x):
return 1. * (x > 0)
def reluDerivative(self, x):
return 1 * (x > 0)