API Python Autograd e inizializzatore

Questo capitolo tratta l'API autograd e inizializzatore in MXNet.

mxnet.autograd

Questa è l'API autograd di MXNet per NDArray. Ha la seguente classe:

Classe: Funzione ()

Viene utilizzato per la differenziazione personalizzata in autograd. Può essere scritto comemxnet.autograd.Function. Se, per qualsiasi motivo, l'utente non desidera utilizzare i gradienti calcolati dalla regola concatenata predefinita, può utilizzare la classe Function di mxnet.autograd per personalizzare la differenziazione per il calcolo. Ha due metodi: Forward () e Backward ().

Cerchiamo di capire il funzionamento di questa classe con l'aiuto dei seguenti punti:

  • Innanzitutto, dobbiamo definire il nostro calcolo nel metodo forward.

  • Quindi, dobbiamo fornire la differenziazione personalizzata nel metodo a ritroso.

  • Ora durante il calcolo del gradiente, invece della funzione all'indietro definita dall'utente, mxnet.autograd utilizzerà la funzione all'indietro definita dall'utente. Possiamo anche eseguire il cast su numpy array e viceversa per alcune operazioni in avanti e indietro.

Example

Prima di utilizzare la classe mxnet.autograd.function, definiamo una funzione sigmoide stabile con metodi all'indietro e in avanti come 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)

Ora, la classe della funzione può essere utilizzata come segue:

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

Quando esegui il codice, vedrai il seguente output:

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

Metodi e loro parametri

Di seguito sono riportati i metodi ei relativi parametri della classe mxnet.autogard.function:

Metodi e suoi parametri Definizione
forward (heads [, head_grads, keep_graph, ...]) Questo metodo viene utilizzato per il calcolo in avanti.
indietro (heads [, head_grads, keep_graph, ...]) Questo metodo viene utilizzato per il calcolo all'indietro. Calcola i gradienti delle teste rispetto alle variabili precedentemente contrassegnate. Questo metodo accetta tanti input quanti output di forward. Restituisce anche tanti NDArray quanti sono gli input del forward.
get_symbol (x) Questo metodo viene utilizzato per recuperare la cronologia dei calcoli registrata come file Symbol.
grad (teste, variabili [, head_grads, ...]) Questo metodo calcola i gradienti delle teste rispetto alle variabili. Una volta calcolati, invece di memorizzare in variable.grad, i gradienti verranno restituiti come nuovi NDArray.
is_recording () Con l'aiuto di questo metodo possiamo ottenere lo stato della registrazione e non della registrazione.
is_training () Con l'aiuto di questo metodo possiamo ottenere lo stato dell'allenamento e della previsione.
mark_variables (variabili, gradienti [, grad_reqs]) Questo metodo contrassegnerà NDArrays come variabili per calcolare il gradiente per autograd. Questo metodo è lo stesso della funzione .attach_grad () in una variabile, ma l'unica differenza è che con questa chiamata possiamo impostare il gradiente su qualsiasi valore.
pausa ([train_mode]) Questo metodo restituisce un contesto di ambito da utilizzare nell'istruzione "with" per i codici che non richiedono il calcolo dei gradienti.
predic_mode () Questo metodo restituisce un contesto di ambito da utilizzare nell'istruzione "with" in cui il comportamento del passaggio in avanti è impostato sulla modalità di inferenza e cioè senza modificare gli stati di registrazione.
record ([train_mode]) Restituirà un file autograd registrazione del contesto dell'ambito da utilizzare nell'istruzione "with" e cattura il codice che richiede il calcolo dei gradienti.
set_recording (is_recording) Simile a is_recoring (), con l'aiuto di questo metodo possiamo ottenere lo stato della registrazione e non della registrazione.
set_training (is_training) Simile a is_traininig (), con l'aiuto di questo metodo possiamo impostare lo stato su training o previsione.
train_mode () Questo metodo restituirà un contesto di ambito da utilizzare nell'istruzione "with" in cui il comportamento del passaggio in avanti è impostato sulla modalità di addestramento e cioè senza modificare gli stati di registrazione.

Esempio di implementazione

Nell'esempio seguente, utilizzeremo il metodo mxnet.autograd.grad () per calcolare il gradiente di testa rispetto alle variabili -

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

L'output è menzionato di seguito:

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

Possiamo usare il metodo mxnet.autograd.predict_mode () per restituire uno scope da usare nell'istruzione 'with' -

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

mxnet.intializer

Questa è l'API di MXNet per l'inizializzatore di pesata. Ha le seguenti classi:

Classi e loro parametri

Di seguito sono riportati i metodi ei relativi parametri di mxnet.autogard.function classe:

Classi e suoi parametri Definizione
Bilineare () Con l'aiuto di questa classe possiamo inizializzare il peso per i layer di up-sampling.
Costante (valore) Questa classe inizializza i pesi su un dato valore. Il valore può essere sia scalare che NDArray che corrisponde alla forma del parametro da impostare.
FusedRNN (init, num_hidden, num_layers, modalità) Come suggerisce il nome, questa classe inizializza i parametri per i layer Recurrent Neural Network (RNN) fusi.
InitDesc Agisce come descrittore per il modello di inizializzazione.
Inizializzatore (** kwargs) Questa è la classe base di un inizializzatore.
LSTMBias ([dimenticare_bias]) Questa classe inizializza tutti i bias di un LSTMCell su 0,0 ma tranne il dimenticare gate il cui bias è impostato su un valore personalizzato.
Carica (param [, default_init, verbose]) Questa classe inizializza le variabili caricando i dati dal file o dal dizionario.
MSRAPrelu ([factor_type, slope]) Come suggerisce il nome, questa classe inizializza il peso in base a una carta MSRA.
Misto (modelli, inizializzatori) Inizializza i parametri utilizzando più inizializzatori.
Normale ([sigma]) La classe Normal () inizializza i pesi con valori casuali campionati da una distribuzione normale con media zero e deviazione standard (SD) di sigma.
Uno() Inizializza i pesi del parametro su uno.
Ortogonale ([scale, rand_type]) Come suggerisce il nome, questa classe inizializza il peso come matrice ortogonale.
Uniforme ([scale]) Inizializza i pesi con valori casuali che vengono campionati in modo uniforme da un determinato intervallo.
Xavier ([rnd_type, factor_type, magnitude]) In realtà restituisce un inizializzatore che esegue l'inizializzazione "Xavier" per i pesi.
Zero() Inizializza i pesi del parametro a zero.

Esempio di implementazione

Nell'esempio seguente, useremo la classe mxnet.init.Normal () per creare un inizializzatore e recuperare i suoi parametri -

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

Output

L'output è fornito di seguito:

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

Example

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

Output

L'output è mostrato di seguito:

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

Nell'esempio seguente, utilizzeremo la classe mxnet.initializer.Mixed () per inizializzare i parametri utilizzando più inizializzatori:

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

L'output è mostrato di seguito:

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