使用 NumPy 的 ReLU 导数
ReLU derivative with NumPy
import numpy as np
def relu(z):
return np.maximum(0,z)
def d_relu(z):
z[z>0]=1
z[z<=0]=0
return z
x=np.array([5,1,-4,0])
y=relu(x)
z=d_relu(y)
print("y = {}".format(y))
print("z = {}".format(z))
上面的代码打印出来:
y = [1 1 0 0]
z = [1 1 0 0]
而不是
y = [5 1 0 0]
z = [1 1 0 0]
据我了解,我使用的函数调用应该只是按值传递,传递变量的副本。
为什么我的 d_relu 函数会影响 y 变量?
您的第一个错误是假设 python 按值传递对象...它不是 - 它是按赋值传递(类似于按引用传递,如果您熟悉此概念)。但是,顾名思义,只有可变对象可以就地修改。其中包括 numpy 数组。
您不应该 d_relu
就地修改 z
,因为这就是它现在通过 z[...] = ...
语法所做的事情。尝试使用广播比较构建掩码并返回它。
def d_relu(z):
return (z > 0).astype(int)
这是一个新数组 returns 而不是就地修改 z
,您的代码会打印
y = [5 1 0 0]
z = [1 1 0 0]
如果您正在构建分层架构,则可以在前向传播阶段利用计算掩码:
class relu:
def __init__(self):
self.mask = None
def forward(self, x):
self.mask = x > 0
return x * self.mask
def backward(self, x):
return self.mask
如果前馈期间的输入 if > 0,则导数仅为 1,否则为 0。
import numpy as np
def relu(z):
return np.maximum(0,z)
def d_relu(z):
z[z>0]=1
z[z<=0]=0
return z
x=np.array([5,1,-4,0])
y=relu(x)
z=d_relu(y)
print("y = {}".format(y))
print("z = {}".format(z))
上面的代码打印出来:
y = [1 1 0 0]
z = [1 1 0 0]
而不是
y = [5 1 0 0]
z = [1 1 0 0]
据我了解,我使用的函数调用应该只是按值传递,传递变量的副本。
为什么我的 d_relu 函数会影响 y 变量?
您的第一个错误是假设 python 按值传递对象...它不是 - 它是按赋值传递(类似于按引用传递,如果您熟悉此概念)。但是,顾名思义,只有可变对象可以就地修改。其中包括 numpy 数组。
您不应该 d_relu
就地修改 z
,因为这就是它现在通过 z[...] = ...
语法所做的事情。尝试使用广播比较构建掩码并返回它。
def d_relu(z):
return (z > 0).astype(int)
这是一个新数组 returns 而不是就地修改 z
,您的代码会打印
y = [5 1 0 0]
z = [1 1 0 0]
如果您正在构建分层架构,则可以在前向传播阶段利用计算掩码:
class relu:
def __init__(self):
self.mask = None
def forward(self, x):
self.mask = x > 0
return x * self.mask
def backward(self, x):
return self.mask
如果前馈期间的输入 if > 0,则导数仅为 1,否则为 0。