我是MXNet的新手(我在Python3中使用它)
他们的教程系列鼓励您定义自己的胶子块。
所以我们说这是你的块(一个常见的卷积结构):
CNN1D类(mx.gluon ….
mx.gluon.nn.Activation 环绕 mx.ndarray.Activation ,见 胶子源代码 。
但是,当使用Gluon构建神经网络时,建议您使用Gluon API而不是分支以任意使用较低级别的MXNet API - 这可能会在Gluon发展并可能发生变化时出现问题(例如停止使用mx.nd在引擎盖下)。
看起来
mx.gluon.nn.Activation(activation=<act>)
是一个包装器,用于从中调用一系列底层激活 NDArray 模块。
NDArray
因此 - 原则上 - 在使用的前向定义中无关紧要
x = self.ramp(x)
要么
x = mx.nd.relu(x)
x = mx.nd.relu(self.ramp(x))
因为relu只是取最大值0和传递的值(因此除了轻微的运行时间增加之外,多个应用程序不会影响除单个调用之外的值)。
因此在 这个 这并不重要。当然,对于其他激活功能,堆叠多个呼叫可能会产生影响。
在他们使用的MXNets文档中 nd.relu 在定义时的前向定义中 gluon.Block 秒。这可能比使用稍微减少开销 mx.gluon.nn.Activation(activation='relu') 。
nd.relu
gluon.Block
mx.gluon.nn.Activation(activation='relu')
风味明智 gluon 模块意味着高级抽象。因此我认为在定义块时应该使用 ramp = mx.gluon.nn.Activation(activation=<act>) 代替 nd.<act>(x) 然后打电话 self.ramp(x) 在前向定义中。
gluon
ramp = mx.gluon.nn.Activation(activation=<act>)
nd.<act>(x)
self.ramp(x)
但是鉴于此时所有的自定义 Block 教程/文档坚持 relu 激活,无论这是否具有持久性后果还有待观察。
Block
relu
一起使用 mx.gluon.nn.Activation 似乎是一种从中调用激活函数的方法 NDArray 来自的模块 Gluon 模块。
mx.gluon.nn.Activation
Gluon