2017-09-25 55 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)