Ручное управление параметрами слоя nn.Dense () в MxNet - PullRequest
0 голосов
/ 04 июня 2018

Я пытаюсь реализовать свой собственный алгоритм оптимизации для MxNet (Imperative / Gluon), который не использует градиенты.Мой вопрос довольно прост: есть ли простой способ создания нового слоя nn.Dense(...), инициализированного параметрами (например, смещения и веса), представленных двумя экземплярами nd.array ()?

Заранее спасибо!

1 Ответ

0 голосов
/ 09 июня 2018

Вы можете создать пользовательский блок с параметрами, которые устанавливают 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
...