首页 > 解决方案 > 在 MxNet 中手动操作 nn.Dense() 层参数

问题描述

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

先感谢您!

标签: mxnet

解决方案


您可以使用设置的参数创建自定义块differentiable=False,并通过参数提供初始化数据init。请参阅scales以下示例中的参数,该示例取自本教程。您还可以查看一个示例,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

推荐阅读