2017-09-25 53 views
1

私は、行列の各要素のRelu微分を計算し、結果を行列で返す関数を実装しようとしています。私はPythonとNumpyを使用しています。PythonでRelu微分を実装するnumpy

他のクロスバリデーションの記事に基づいて、xのRelu誘導体が 1は、x> 0、0時にX < 0、未定義またはX == 0

現在、私は次のコードを持っている0 far:

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 

残念ながらxは行列なので、xiは配列です。 reluDerivativeSingleElement関数は配列では機能しません。だから、numpyでexp関数のように、numpyを使って行列の値を別の行列にマップする方法があるのだろうか?

ありがとうございます。

+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'を変更すると、元の' x'が関数 – Ron7

0

あなたは良い軌道に乗っています:ベクトル化操作を考えています。関数を定義するところで、forループを書くのではなく、この関数を行列に適用します。

このスレッドは、条件を満たすすべての要素を置き換える質問に答えます。それをReLUの派生語に変更することができます。また

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

、Pythonはラムダ関数を使用しようと、非常によく機能的なプログラミングをサポートしています。ベクトル化の練習だ

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

3

このコード

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

は、それらを含むブール式は、要素のためにこれらの式の値の配列になっているので、これは、numpyの配列のために働くだろう何かである

y = (x > 0) * 1 

に再定式化することができます前記配列内にある。私は、これはあなたが探しているものだと思い

+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)