Python 带NumPy的ReLU导数

Python 带NumPy的ReLU导数,python,arrays,numpy,activation-function,relu,Python,Arrays,Numpy,Activation Function,Relu,而不是 y = [1 1 0 0] z = [1 1 0 0] 据我所知,我使用的函数调用应该只通过值传递,传递变量的副本 为什么我的d_relu函数会影响y变量 您的第一个错误是假设python按值传递对象。。。它不是-它是通过赋值传递的(类似于通过引用传递,如果您熟悉这个概念的话)。但是,顾名思义,只有可变对象才能就地修改。其中包括numpy阵列 您不应该让d_relumodifyz就位,因为它现在正通过z[…]=…语法执行此操作。尝试使用广播比较构建掩码,并返回该掩码 y = [5 1

而不是

y = [1 1 0 0]
z = [1 1 0 0]
据我所知,我使用的函数调用应该只通过值传递,传递变量的副本


为什么我的d_relu函数会影响y变量

您的第一个错误是假设python按值传递对象。。。它不是-它是通过赋值传递的(类似于通过引用传递,如果您熟悉这个概念的话)。但是,顾名思义,只有可变对象才能就地修改。其中包括numpy阵列

您不应该让
d_relu
modify
z
就位,因为它现在正通过
z[…]=…
语法执行此操作。尝试使用广播比较构建掩码,并返回该掩码

y = [5 1 0 0]
z = [1 1 0 0]
这将返回一个新的数组,而不是就地修改
z
,并打印代码

def d_relu(z):
    return (z > 0).astype(int)
如果要构建分层体系结构,可以在前向传递阶段利用计算掩码:

y = [5 1 0 0]
z = [1 1 0 0]

如果前馈过程中的输入大于0,则导数仅为1。

太感谢了。坦白说,我不明白你所说的“就地”,它对y到底有什么影响,因为据我所知,我传递了一份y,所以无论d_relu对副本做了什么都不应该影响y,是吗?@user6116844这就是你错的地方,因为你传递了相同的对象。。。你在任何地方都不会复制,python也不会隐式地为你复制。哇!!先生,你帮了我很多忙。非常感谢。我现在很高兴
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