Autograd et initialiseur d'API Python

Ce chapitre traite de l'API autograd et initializer dans MXNet.

mxnet.autograd

Il s'agit de l'API autograd de MXNet pour NDArray. Il a la classe suivante -

Classe: Fonction ()

Il est utilisé pour la différenciation personnalisée en autograd. Il peut être écrit commemxnet.autograd.Function. Si, pour une raison quelconque, l'utilisateur ne souhaite pas utiliser les gradients calculés par la règle de chaîne par défaut, il peut utiliser la classe Function de mxnet.autograd pour personnaliser la différenciation pour le calcul. Il a deux méthodes à savoir Forward () et Backward ().

Comprenons le fonctionnement de cette classe à l'aide des points suivants -

  • Tout d'abord, nous devons définir notre calcul dans la méthode forward.

  • Ensuite, nous devons fournir la différenciation personnalisée dans la méthode descendante.

  • Maintenant, pendant le calcul du gradient, au lieu de la fonction arrière définie par l'utilisateur, mxnet.autograd utilisera la fonction arrière définie par l'utilisateur. Nous pouvons également convertir en tableau numpy et en arrière pour certaines opérations en avant comme en arrière.

Example

Avant d'utiliser la classe mxnet.autograd.function, définissons une fonction sigmoïde stable avec des méthodes arrière et avant comme suit -

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)

Maintenant, la classe de fonction peut être utilisée comme suit -

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

Lorsque vous exécutez le code, vous verrez la sortie suivante -

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

Méthodes et leurs paramètres

Voici les méthodes et leurs paramètres de la classe mxnet.autogard.function -

Méthodes et ses paramètres Définition
avant (heads [, head_grads, hold_graph,…]) Cette méthode est utilisée pour le calcul direct.
en arrière (heads [, head_grads, hold_graph,…]) Cette méthode est utilisée pour le calcul en arrière. Il calcule les gradients des têtes par rapport aux variables précédemment marquées. Cette méthode prend autant d'entrées que de sortie de l'avant. Il renvoie également autant de NDArray que d'entrées de transfert.
get_symbol (x) Cette méthode est utilisée pour récupérer l'historique des calculs enregistrés comme Symbol.
grad (heads, variables [, head_grads,…]) Cette méthode calcule les gradients des têtes par rapport aux variables. Une fois calculés, au lieu d'être stockés dans variable.grad, les gradients seront renvoyés en tant que nouveaux NDArrays.
is_recording () Avec l'aide de cette méthode, nous pouvons obtenir le statut de l'enregistrement et non de l'enregistrement.
is_training () Avec l'aide de cette méthode, nous pouvons obtenir un statut sur la formation et les prévisions.
mark_variables (variables, gradients [, grad_reqs]) Cette méthode marquera les NDArrays en tant que variables pour calculer le gradient pour l'autogradation. Cette méthode est la même que la fonction .attach_grad () dans une variable mais la seule différence est qu'avec cet appel, nous pouvons définir le gradient sur n'importe quelle valeur.
pause ([train_mode]) Cette méthode retourne un contexte de portée à utiliser dans l'instruction «with» pour les codes qui n'ont pas besoin de calculer des gradients.
prédire_mode () Cette méthode retourne un contexte de portée à utiliser dans l'instruction 'with' dans laquelle le comportement de transmission avant est défini sur le mode d'inférence et sans modifier les états d'enregistrement.
record ([train_mode]) Il renverra un autograd enregistrement du contexte de portée à utiliser dans l'instruction «with» et capture le code qui nécessite le calcul des gradients.
set_recording (is_recording) Similaire à is_recoring (), avec l'aide de cette méthode, nous pouvons obtenir le statut de l'enregistrement et non de l'enregistrement.
set_training (is_training) Similaire à is_traininig (), avec l'aide de cette méthode, nous pouvons définir le statut sur entraînement ou prédiction.
train_mode () Cette méthode renverra un contexte de portée à utiliser dans l'instruction «with» dans laquelle le comportement de passage avant est défini sur le mode d'apprentissage et sans modifier les états d'enregistrement.

Exemple d'implémentation

Dans l'exemple ci-dessous, nous utiliserons la méthode mxnet.autograd.grad () pour calculer le gradient de tête par rapport aux 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 sortie est mentionnée ci-dessous -

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

Nous pouvons utiliser la méthode mxnet.autograd.predict_mode () pour renvoyer une portée à utiliser dans l'instruction 'with' -

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

mxnet.intializer

Il s'agit de l'API de MXNet pour l'initialiseur de pesée. Il a les classes suivantes -

Classes et leurs paramètres

Voici les méthodes et leurs paramètres de mxnet.autogard.function classe:

Classes et ses paramètres Définition
Bilinéaire () Avec l'aide de cette classe, nous pouvons initialiser le poids pour les couches de suréchantillonnage.
Constante (valeur) Cette classe initialise les poids à une valeur donnée. La valeur peut être un scalaire ou un NDArray qui correspond à la forme du paramètre à définir.
FusedRNN (init, num_hidden, num_layers, mode) Comme son nom l'indique, cette classe initialise les paramètres des couches fusionnées du réseau neuronal récurrent (RNN).
InitDesc Il sert de descripteur pour le modèle d'initialisation.
Initialiseur (** kwargs) Il s'agit de la classe de base d'un initialiseur.
LSTMBias ([forget_bias]) Cette classe initialise tous les biais d'un LSTMCell à 0.0 mais à l'exception de la porte Oublier dont le biais est défini sur une valeur personnalisée.
Charger (param [, default_init, verbose]) Cette classe initialise les variables en chargeant des données à partir d'un fichier ou d'un dictionnaire.
MSRAPrelu ([type_facteur, pente]) Comme son nom l'indique, cette classe Initialise le poids selon un papier MSRA.
Mixte (modèles, initialiseurs) Il initialise les paramètres à l'aide de plusieurs initialiseurs.
Normal ([sigma]) La classe Normal () initialise les poids avec des valeurs aléatoires échantillonnées à partir d'une distribution normale avec une moyenne de zéro et un écart type (SD) de sigma.
Un() Il initialise les poids du paramètre à un.
Orthogonal ([scale, rand_type]) Comme son nom l'indique, cette classe initialise le poids en tant que matrice orthogonale.
Uniforme ([échelle]) Il initialise les poids avec des valeurs aléatoires qui sont uniformément échantillonnées dans une plage donnée.
Xavier ([rnd_type, factor_type, magnitude]) Il renvoie en fait un initialiseur qui effectue l'initialisation «Xavier» pour les poids.
Zéro() Il initialise les poids du paramètre à zéro.

Exemple d'implémentation

Dans l'exemple ci-dessous, nous utiliserons la classe mxnet.init.Normal () pour créer un initialiseur et récupérer ses paramètres -

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

Output

La sortie est donnée ci-dessous -

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

Example

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

Output

La sortie est indiquée ci-dessous -

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

Dans l'exemple ci-dessous, nous utiliserons la classe mxnet.initializer.Mixed () pour initialiser les paramètres à l'aide de plusieurs initialiseurs -

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 sortie est indiquée ci-dessous -

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