マトリックス内の各要素のRelu導関数を計算し、結果をマトリックスで返す関数を実装しようとしています。私はPython and 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
残念ながら、xは行列であるため、xiは配列です。 reluDerivativeSingleElement関数は配列では機能しません。だから私は、numpyのexp関数のように、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.]])
これはベクトル化の演習です。
このコード
if x > 0:
y = 1
Elif xi <= 0:
y = 0
に再定式化できる
y = (x > 0) * 1
これは、numpy配列で機能するものです。これは、それらを含むブール式が、その配列内の要素のこれらの式の値の配列に変換されるためです。
Reluの導関数を返す基本関数は、次のように要約できます。
f'(x) = x > 0
だから、numpyでは:
def relu_derivative(z):
return np.greater(z, 0).astype(int)
def dRelu(z):
return np.where(z <= 0, 0, 1)
ここで、zは私の場合のndarrayです。
Neilがコメントで述べたように、numpyの heaviside 関数を使用できます。
def reluDerivative(self, x):
return np.heaviside(x, 0)
順調に進んでいます:ベクトル化された操作を考えてください。ここで、関数を定義し、forループを記述する代わりに、この関数を行列に適用します。
このスレッドはあなたの質問に答え、そこですべての要素が条件を満たします。 ReLU派生物に変更できます。
https://stackoverflow.com/questions/19766757/replacing-numpy-elements-if-condition-is-met
さらに、pythonは関数型プログラミングを非常によくサポートしています。ラムダ関数を使用してみてください。
純粋なPythonを使用する場合:
def relu_derivative(x):
return max(sign(x), 0)
これは動作します:
def dReLU(x):
return 1. * (x > 0)
def reluDerivative(self, x):
return 1 * (x > 0)