首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >带ReLU导数的NumPy

带ReLU导数的NumPy
EN

Stack Overflow用户
提问于 2018-05-01 18:32:53
回答 1查看 7K关注 0票数 3
代码语言:javascript
复制
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))

上面的代码打印出来:

代码语言:javascript
复制
y = [1 1 0 0]
z = [1 1 0 0]

而不是

代码语言:javascript
复制
y = [5 1 0 0]
z = [1 1 0 0]

据我所理解,我使用的函数调用应该只执行按值传递的操作,传递变量的副本。

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

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-05-01 18:36:38

第一个错误是假设python按值传递对象..。它不-它是通过分配(类似于通过引用传递,如果你熟悉这个概念)。但是,正如名称所示,只有可变对象才能就地修改.除其他外,这包括numpy数组。

您不应该让d_relu修改z,因为通过z[...] = ...语法,它现在就是这样做的。尝试使用广播比较构建一个掩码,然后返回它。

代码语言:javascript
复制
def d_relu(z):
    return (z > 0).astype(int)

这将返回一个新数组,而不是就地修改z,您的代码将打印出来。

代码语言:javascript
复制
y = [5 1 0 0]
z = [1 1 0 0]

如果您正在构建分层体系结构,则可以在向前通过阶段利用计算掩码:

代码语言:javascript
复制
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,如果前馈期间的输入大于0,则为Where 0。

票数 8
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50121887

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档