Python API Autograd e Initializer

Este capítulo trata da API de autograd e inicializador no MXNet.

mxnet.autograd

Esta é a API de autograd do MXNet para NDArray. Tem a seguinte classe -

Classe: Function ()

É usado para diferenciação personalizada no autograd. Pode ser escrito comomxnet.autograd.Function. Se, por qualquer motivo, o usuário não quiser usar os gradientes que são calculados pela regra em cadeia padrão, ele / ela pode usar a classe Function de mxnet.autograd para personalizar a diferenciação para computação. Ele possui dois métodos: Forward () e Backward ().

Vamos entender o funcionamento desta aula com a ajuda dos seguintes pontos -

  • Primeiro, precisamos definir nosso cálculo no método direto.

  • Em seguida, precisamos fornecer a diferenciação personalizada no método reverso.

  • Agora, durante o cálculo do gradiente, em vez da função retrógrada definida pelo usuário, mxnet.autograd usará a função retrógrada definida pelo usuário. Também podemos converter em numpy array e back para algumas operações tanto para frente quanto para trás.

Example

Antes de usar a classe mxnet.autograd.function, vamos definir uma função sigmóide estável com métodos para trás e para a frente como segue -

class sigmoid(mx.autograd.Function):
   def forward(self, x):
      y = 1 / (1 + mx.nd.exp(-x))
      self.save_for_backward(y)
      return y
   
   def backward(self, dy):
      y, = self.saved_tensors
      return dy * y * (1-y)

Agora, a classe de função pode ser usada da seguinte maneira -

func = sigmoid()
x = mx.nd.random.uniform(shape=(10,))
x.attach_grad()
with mx.autograd.record():
m = func(x)
m.backward()
dx_grad = x.grad.asnumpy()
dx_grad

Output

Ao executar o código, você verá a seguinte saída -

array([0.21458015, 0.21291625, 0.23330082, 0.2361367 , 0.23086983,
0.24060014, 0.20326573, 0.21093895, 0.24968489, 0.24301809],
dtype=float32)

Métodos e seus parâmetros

A seguir estão os métodos e seus parâmetros da classe mxnet.autogard.function -

Métodos e seus parâmetros Definição
forward (heads [, head_grads, reter_graph, ...]) Este método é usado para computação direta.
para trás (cabeças [, cabeça_grads, retém_grafo, ...]) Este método é usado para computação retroativa. Ele calcula os gradientes de cabeças em relação às variáveis ​​previamente marcadas. Este método recebe tantas entradas quanto a saída de forward. Ele também retorna tantos NDArray quanto entradas de encaminhamento.
get_symbol (x) Este método é usado para recuperar o histórico de computação registrado como Symbol.
grad (cabeças, variáveis ​​[, cabeça_grads, ...]) Este método calcula os gradientes de cabeças em relação às variáveis. Uma vez computados, em vez de serem armazenados em variable.grad, os gradientes serão retornados como novos NDArrays.
is_recording () Com a ajuda desse método, podemos obter o status da gravação e não da gravação.
is_training () Com a ajuda desse método, podemos obter o status do treinamento e da previsão.
mark_variables (variáveis, gradientes [, grad_reqs]) Este método marcará NDArrays como variáveis ​​para calcular gradiente para autograd. Este método é o mesmo que a função .attach_grad () em uma variável, mas a única diferença é que com essa chamada podemos definir o gradiente para qualquer valor.
pausar ([train_mode]) Este método retorna um contexto de escopo a ser usado na instrução 'with' para códigos que não precisam de gradientes para serem calculados.
Predict_mode () Este método retorna um contexto de escopo a ser usado na instrução 'with' em que o comportamento de encaminhamento é definido para o modo de inferência, sem alterar os estados de gravação.
registro ([train_mode]) Ele retornará um autograd registro do contexto do escopo a ser usado na instrução 'com' e captura o código que precisa de gradientes para serem calculados.
set_recording (is_recording) Semelhante a is_recoring (), com a ajuda deste método podemos obter o status da gravação e não da gravação.
set_training (is_training) Semelhante a is_traininig (), com a ajuda deste método podemos definir o status para treinamento ou previsão.
train_mode () Este método retornará um contexto de escopo a ser usado na instrução 'with' em que o comportamento de encaminhamento é definido para o modo de treinamento e sem alterar os estados de gravação.

Exemplo de Implementação

No exemplo a seguir, estaremos usando o método mxnet.autograd.grad () para calcular o gradiente de altura em relação às variáveis ​​-

x = mx.nd.ones((2,))
x.attach_grad()
with mx.autograd.record():
z = mx.nd.elemwise_add(mx.nd.exp(x), x)
dx_grad = mx.autograd.grad(z, [x], create_graph=True)
dx_grad

Output

O resultado é mencionado abaixo -

[
[3.7182817 3.7182817]
<NDArray 2 @cpu(0)>]

Podemos usar o método mxnet.autograd.predict_mode () para retornar um escopo a ser usado na instrução 'with' -

with mx.autograd.record():
y = model(x)
with mx.autograd.predict_mode():
y = sampling(y)
backward([y])

mxnet.intializer

Esta é a API MXNet para inicializador de pesagem. Tem as seguintes classes -

Classes e seus parâmetros

A seguir estão os métodos e seus parâmetros de mxnet.autogard.function classe:

Classes e seus parâmetros Definição
Bilinear () Com a ajuda desta classe, podemos inicializar o peso para camadas de up-sampling.
Valor constante) Essa classe inicializa os pesos para um determinado valor. O valor pode ser um escalar, bem como NDArray que corresponde à forma do parâmetro a ser definido.
FusedRNN (init, num_hidden, num_layers, modo) Como o nome indica, esta classe inicializa parâmetros para as camadas da Rede Neural Recorrente (RNN) fundida.
InitDesc Ele atua como o descritor do padrão de inicialização.
Inicializador (** kwargs) Esta é a classe base de um inicializador.
LSTMBias ([esquecer_bias]) Esta classe inicializa todas as polarizações de um LSTMCell para 0,0, mas exceto para a porta de esquecimento, cuja polarização é definida como um valor personalizado.
Carregar (param [, default_init, verbose]) Esta classe inicializa as variáveis ​​carregando dados do arquivo ou dicionário.
MSRAPrelu ([fator_tipo, inclinação]) Como o nome indica, esta classe inicializa a gramatura de acordo com um papel MSRA.
Misto (padrões, inicializadores) Ele inicializa os parâmetros usando vários inicializadores.
Normal ([sigma]) A classe Normal () inicializa pesos com valores aleatórios amostrados a partir de uma distribuição normal com uma média de zero e desvio padrão (SD) de sigma.
1() Ele inicializa os pesos do parâmetro para um.
Ortogonal ([escala, tipo_rand]) Como o nome indica, esta classe inicializa o peso como uma matriz ortogonal.
Uniforme ([escala]) Ele inicializa pesos com valores aleatórios que são amostrados uniformemente de um determinado intervalo.
Xavier ([rnd_type, factor_type, magnitude]) Na verdade, ele retorna um inicializador que executa a inicialização “Xavier” para pesos.
Zero() Ele inicializa os pesos do parâmetro para zero.

Exemplo de Implementação

No exemplo abaixo, estaremos usando a classe mxnet.init.Normal () para criar um inicializador e recuperar seus parâmetros -

init = mx.init.Normal(0.8)
init.dumps()

Output

O resultado é dado abaixo -

'["normal", {"sigma": 0.8}]'

Example

init = mx.init.Xavier(factor_type="in", magnitude=2.45)
init.dumps()

Output

O resultado é mostrado abaixo -

'["xavier", {"rnd_type": "uniform", "factor_type": "in", "magnitude": 2.45}]'

No exemplo a seguir, usaremos a classe mxnet.initializer.Mixed () para inicializar parâmetros usando vários inicializadores -

init = mx.initializer.Mixed(['bias', '.*'], [mx.init.Zero(),
mx.init.Uniform(0.1)])
module.init_params(init)

for dictionary in module.get_params():
for key in dictionary:
print(key)
print(dictionary[key].asnumpy())

Output

O resultado é mostrado abaixo -

fullyconnected1_weight
[[ 0.0097627 0.01856892 0.04303787]]
fullyconnected1_bias
[ 0.]