Autograduación e inicializador de API de Python

Este capítulo trata sobre la API de autograduación e inicialización en MXNet.

mxnet.autograd

Esta es la API de autogrado de MXNet para NDArray. Tiene la siguiente clase:

Clase: Función ()

Se utiliza para la diferenciación personalizada en autogrados. Puede escribirse comomxnet.autograd.Function. Si, por alguna razón, el usuario no desea utilizar los gradientes que se calculan mediante la regla de la cadena predeterminada, entonces puede utilizar la clase de función de mxnet.autograd para personalizar la diferenciación para el cálculo. Tiene dos métodos, a saber, Forward () y Backward ().

Entendamos el funcionamiento de esta clase con la ayuda de los siguientes puntos:

  • Primero, necesitamos definir nuestro cálculo en el método de avance.

  • Luego, debemos proporcionar la diferenciación personalizada en el método hacia atrás.

  • Ahora, durante el cálculo del gradiente, en lugar de la función hacia atrás definida por el usuario, mxnet.autograd utilizará la función hacia atrás definida por el usuario. También podemos lanzar a una matriz numpy y retroceder para algunas operaciones tanto hacia adelante como hacia atrás.

Example

Antes de usar la clase mxnet.autograd.function, definamos una función sigmoidea estable con métodos tanto hacia atrás como hacia adelante de la siguiente manera:

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)

Ahora, la clase de función se puede usar de la siguiente manera:

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

Cuando ejecute el código, verá el siguiente resultado:

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 y sus parámetros

A continuación se muestran los métodos y sus parámetros de la clase mxnet.autogard.function:

Métodos y sus parámetros Definición
adelante (jefes [, jefes_graduados, retener_grafo,…]) Este método se utiliza para el cálculo directo.
hacia atrás (jefes [, jefes_graduados, retener_grafo,…]) Este método se utiliza para el cálculo hacia atrás. Calcula las pendientes de las cabezas con respecto a las variables previamente marcadas. Este método toma tantas entradas como salida de reenvío. También devuelve tantos NDArray como entradas de reenvío.
get_symbol (x) Este método se utiliza para recuperar el historial de cálculo registrado como Symbol.
grad (jefes, variables [, jefes_grados,…]) Este método calcula los gradientes de las cabezas con respecto a las variables. Una vez calculados, en lugar de almacenarlos en variable.grad, los gradientes se devolverán como nuevos NDArrays.
is_recording () Con la ayuda de este método podemos obtener el estado de la grabación y no la grabación.
está entrenando() Con la ayuda de este método podemos obtener el estado del entrenamiento y la predicción.
mark_variables (variables, gradientes [, grad_reqs]) Este método marcará NDArrays como variables para calcular el gradiente para autograduación. Este método es el mismo que la función .attach_grad () en una variable, pero la única diferencia es que con esta llamada podemos establecer el gradiente en cualquier valor.
pausa ([train_mode]) Este método devuelve un contexto de alcance que se utilizará en la declaración 'con' para los códigos que no necesitan que se calculen los gradientes.
predecir_modo () Este método devuelve un contexto de alcance que se utilizará en la declaración 'con' en la que el comportamiento de paso directo se establece en modo de inferencia y eso es sin cambiar los estados de grabación.
registro ([train_mode]) Devolverá un autograd registra el contexto del alcance que se utilizará en la declaración 'con' y captura el código que necesita que se calculen los gradientes.
set_recording (is_recording) Similar a is_recoring (), con la ayuda de este método podemos obtener el estado de la grabación y no la grabación.
set_training (is_training) Similar a is_traininig (), con la ayuda de este método podemos establecer el estado para entrenar o predecir.
train_mode () Este método devolverá un contexto de alcance que se usará en la declaración 'con' en la que el comportamiento de paso hacia adelante se establece en modo de entrenamiento y eso es sin cambiar los estados de grabación.

Ejemplo de implementación

En el siguiente ejemplo, usaremos el método mxnet.autograd.grad () para calcular el gradiente de la cabeza con respecto a las variables:

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

La salida se menciona a continuación:

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

Podemos usar el método mxnet.autograd.predict_mode () para devolver un alcance que se usará en la declaración 'with' -

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

mxnet.intializer

Esta es la API de MXNet para el inicializador de pesaje. Tiene las siguientes clases:

Clases y sus parámetros

A continuación se muestran los métodos y sus parámetros de mxnet.autogard.function clase:

Clases y sus parámetros Definición
Bilineal () Con la ayuda de esta clase podemos inicializar el peso para las capas de muestreo ascendente.
Valor constante) Esta clase inicializa los pesos a un valor dado. El valor puede ser un escalar y un NDArray que coincida con la forma del parámetro que se va a configurar.
FusedRNN (init, num_hidden, num_layers, mode) Como su nombre lo indica, esta clase inicializa los parámetros para las capas fusionadas de la red neuronal recurrente (RNN).
InitDesc Actúa como descriptor del patrón de inicialización.
Inicializador (** kwargs) Ésta es la clase base de un inicializador.
LSTMBias ([olvide_bias]) Esta clase inicializa todos los sesgos de una LSTMCell en 0.0, excepto la puerta de olvido, cuyo sesgo se establece en un valor personalizado.
Cargar (param [, default_init, verbose]) Esta clase inicializa las variables cargando datos desde un archivo o diccionario.
MSRAPrelu ([factor_type, pendiente]) Como su nombre lo indica, esta clase Inicializa el peso de acuerdo con un papel MSRA.
Mixto (patrones, inicializadores) Inicializa los parámetros usando múltiples inicializadores.
Normal ([sigma]) La clase Normal () inicializa pesos con valores aleatorios muestreados de una distribución normal con una media de cero y una desviación estándar (DE) de sigma.
Uno() Inicializa los pesos del parámetro a uno.
Ortogonal ([scale, rand_type]) Como su nombre lo indica, esta clase inicializa el peso como matriz ortogonal.
Uniforme ([escala]) Inicializa pesos con valores aleatorios que se muestrean uniformemente de un rango dado.
Xavier ([rnd_type, factor_type, magnitude]) En realidad, devuelve un inicializador que realiza la inicialización "Xavier" para pesos.
Cero() Inicializa los pesos del parámetro a cero.

Ejemplo de implementación

En el siguiente ejemplo, usaremos mxnet.init.Normal () class crea un inicializador y recupera sus parámetros -

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

Output

La salida se da a continuación:

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

Example

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

Output

La salida se muestra a continuación:

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

En el siguiente ejemplo, usaremos la clase mxnet.initializer.Mixed () para inicializar parámetros usando múltiples 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

La salida se muestra a continuación:

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