mx.gluon.nn.Activation环绕mx.ndarray.Activation ,请参阅Gluon 源代码 。
但是,在使用Gluon构建神经网络时,建议您使用Gluon API,不要随意分支以使用较低级别的MXNet API-随着Gluon的发展和可能的改变,它可能会出现问题(例如,停止使用mx.nd在引擎盖下)。
0
mx.gluon.nn.Activation环绕mx.ndarray.Activation ,请参阅Gluon 源代码 。
但是,在使用Gluon构建神经网络时,建议您使用Gluon API,不要随意分支以使用较低级别的MXNet API-随着Gluon的发展和可能的改变,它可能会出现问题(例如,停止使用mx.nd在引擎盖下)。
0
看起来
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
模块。
0
我是MXNet的新手(我正在Python3中使用它)
他们的教程系列鼓励您定义自己的
gluon
嵌段 。因此,可以说这是您的块(常见的卷积结构):
这是其示例结构的镜像。
mx.nd.relu
和mx.gluon.nn.Activation
什么mx.gluon.nn.Activation
?应该是
代替