MXNet:nn.Activation 与 nd.relu?

2024-04-05

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

他们的教程系列鼓励您定义自己的gluon blocks http://gluon.mxnet.io/chapter03_deep-neural-networks/plumbing.html.

假设这是您的块(常见的卷积结构):

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.relu vs mx.gluon.nn.Activation?

应该是

x = self.ramp(x)

代替

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

看起来

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

是一个包装器,用于从NDArray模块。

因此,原则上,在前向定义中是否使用并不重要

x = self.ramp(x)

or

x = mx.nd.relu(x)

or

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

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

Thus in this情况并不重要。当然,对于其他激活函数来说,堆叠多个调用可能会产生影响。

在 MXNets 文档中他们使用nd.relu在定义时的前向定义中gluon.Blocks。这可能会比使用稍微少一点的开销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模块。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

MXNet:nn.Activation 与 nd.relu? 的相关文章

随机推荐