MXNet:nn.Activation与nd.relu?
mxnet
python-3.x
12
0

我是MXNet的新手(我正在Python3中使用它)

他们的教程系列鼓励您定义自己的gluon嵌段

因此,可以说这是您的块(常见的卷积结构):

class CNN1D(mx.gluon.Block):
    def __init__(self, **kwargs):
        super(CNN1D, self).__init__(**kwargs)
        with self.name_scope():
            self.cnn = mx.gluon.nn.Conv1D(10, 1)
            self.bn = mx.gluon.nn.BatchNorm()
            self.ramp = mx.gluon.nn.Activation(activation='relu')

    def forward(self, x):
        x = mx.nd.relu(self.cnn(x))
        x = mx.nd.relu(self.bn(x))
        x = mx.nd.relu(self.ramp(x))
        return x

这是其示例结构的镜像。 mx.nd.relumx.gluon.nn.Activation什么mx.gluon.nn.Activation

应该是

x = self.ramp(x)

代替

x = mx.nd.relu(self.ramp(x))
参考资料:
Stack Overflow
收藏
评论
共 2 个回答
高赞 时间 活跃

mx.gluon.nn.Activation环绕mx.ndarray.Activation ,请参阅Gluon 源代码

但是,在使用Gluon构建神经网络时,建议您使用Gluon API,不要随意分支以使用较低级别的MXNet API-随着Gluon的发展和可能的改变,它可能会出现问题(例如,停止使用mx.nd在引擎盖下)。

收藏
评论

看起来

mx.gluon.nn.Activation(activation=<act>)

是用于从NDArray模块调用基础激活的主机的包装器。

因此,从原则上讲,在前向定义中是否使用

x = self.ramp(x)

要么

x = mx.nd.relu(x)

要么

x = mx.nd.relu(self.ramp(x))

因为relu只是采用最大值0和传递的值(因此,除了运行时间略有增加之外,多个应用程序不会对单个调用产生太大影响)。

因此,在这种情况下,它并不重要。当然,对于其他激活功能,堆叠多个调用可能会产生影响。

在MXNets文档中,当定义gluon.Block时,它们在正向定义中使用nd.relu 。与使用mx.gluon.nn.Activation(activation='relu')相比,这可能会带来较少的开销。

从口味上讲, gluon模块是高级抽象。因此,我认为在定义一个块时,应该使用ramp = mx.gluon.nn.Activation(activation=<act>)而不是nd.<act>(x) ,然后在其中调用self.ramp(x)前向定义。

但是,考虑到这一点,所有自定义的Block教程/文档都坚持使用relu激活,这是否会产生持久的后果还有待观察。

一起使用mx.gluon.nn.Activation似乎是一个方法调用激活函数从NDArray从模块Gluon模块。

收藏
评论
新手导航
  • 社区规范
  • 提出问题
  • 进行投票
  • 个人资料
  • 优化问题
  • 回答问题

关于我们

常见问题

内容许可

联系我们

@2020 AskGo
京ICP备20001863号