在MxNet中手动操作nn.Dense()图层参数

时间:2018-06-04 01:27:59

标签: mxnet

我正在尝试为不使用渐变的MxNet(Imperative / Gluon)实现我自己的优化算法。我的问题很简单,是否有一种简单的方法来创建由两个nd.array()实例表示的参数(即偏差和权重)初始化的新nn.Dense(...)图层?

提前谢谢!

1 个答案:

答案 0 :(得分:1)

您可以使用设置differentiable=False的参数创建自定义块,并通过init参数提供初始化数据。请参阅以下示例中的scales参数,该参数取自this tutorial。您还可以看到FullyConnected的示例,您也希望将其用于密集图层。 F用于表示通用后端,通常为mx.ndarray,但在杂交后,此值设为mx.symbol

class NormalizationHybridLayer(gluon.HybridBlock):
    def __init__(self, hidden_units, scales):
        super(NormalizationHybridLayer, self).__init__()

        with self.name_scope():
            self.weights = self.params.get('weights',
                                           shape=(hidden_units, 0),
                                           allow_deferred_init=True)

            self.scales = self.params.get('scales',
                                      shape=scales.shape,
                                      init=mx.init.Constant(scales.asnumpy().tolist()), # Convert to regular list to make this object serializable
                                      differentiable=False)

    def hybrid_forward(self, F, x, weights, scales):
        normalized_data = F.broadcast_div(F.broadcast_sub(x, F.min(x)), (F.broadcast_sub(F.max(x), F.min(x))))
        weighted_data = F.FullyConnected(normalized_data, weights, num_hidden=self.weights.shape[0], no_bias=True)
        scaled_data = F.broadcast_mul(scales, weighted_data)
        return scaled_data