【问题标题】:ReLU derivative with NumPy使用 NumPy 的 ReLU 导数
【发布时间】:2018-10-11 19:27:12
【问题描述】:
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 arrays numpy activation-function relu


    【解决方案1】:

    您的第一个错误是假设 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
    

    如果前馈期间的输入如果 > 0,则导数仅为 1,否则为 0。

    【讨论】:

    • 非常感谢..坦率地说,我不明白您所说的 inplace 是什么意思,d_relu 对 y 到底做了什么,因为根据我的理解,我传递了 y 的副本,所以无论 d_relu 做什么到副本现在应该不会影响你吗?
    • @user6116844 那是你弄错了,因为你传递了同一个对象......你在任何地方都没有复制,python 不会隐式地为你复制。
    • 哇!!先生,您帮了我很多忙……非常感谢……我现在很高兴
    猜你喜欢
    • 2018-03-06
    • 1970-01-01
    • 2018-11-04
    • 2015-11-13
    • 1970-01-01
    • 1970-01-01
    • 2017-06-21
    • 2019-11-16
    • 2017-12-10
    相关资源
    最近更新 更多