ReLU衍生品与NumPy

时间:2018-05-01 18:32:54

标签: python arrays numpy activation-function relu

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变量?

1 个答案:

答案 0 :(得分:5)

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

您不应该d_relu修改z到位,因为它现在正在通过z[...] = ...语法进行修改。尝试使用广播比较构建一个掩码,然后返回它。

def d_relu(z):
    return (z > 0).astype(int)

这将返回一个全新数组,而不是就地修改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

如果在前馈期间输入,则导数仅为1,如果&gt; 0,否则为0。