Python API Autograd und Initializer
Dieses Kapitel befasst sich mit der Autograd- und Initialisierungs-API in MXNet.
mxnet.autograd
Dies ist die Autograd-API von MXNet für NDArray. Es hat die folgende Klasse -
Klasse: Funktion ()
Es wird zur kundenspezifischen Differenzierung im Autograd verwendet. Es kann geschrieben werden alsmxnet.autograd.Function. Wenn der Benutzer aus irgendeinem Grund die Gradienten nicht verwenden möchte, die durch die Standardkettenregel berechnet werden, kann er die Funktionsklasse von mxnet.autograd verwenden, um die Differenzierung für die Berechnung anzupassen. Es gibt zwei Methoden, nämlich Forward () und Backward ().
Lassen Sie uns die Arbeitsweise dieser Klasse anhand der folgenden Punkte verstehen:
Zuerst müssen wir unsere Berechnung in der Vorwärtsmethode definieren.
Dann müssen wir die angepasste Differenzierung in der Rückwärtsmethode bereitstellen.
Während der Gradientenberechnung verwendet mxnet.autograd anstelle der benutzerdefinierten Rückwärtsfunktion die vom Benutzer definierte Rückwärtsfunktion. Wir können für einige Operationen sowohl vorwärts als auch rückwärts in numpy array und back umwandeln.
Example
Bevor Sie die Klasse mxnet.autograd.function verwenden, definieren wir eine stabile Sigmoidfunktion mit Rückwärts- und Vorwärtsmethoden wie folgt:
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)
Jetzt kann die Funktionsklasse wie folgt verwendet werden:
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
Wenn Sie den Code ausführen, wird die folgende Ausgabe angezeigt:
array([0.21458015, 0.21291625, 0.23330082, 0.2361367 , 0.23086983,
0.24060014, 0.20326573, 0.21093895, 0.24968489, 0.24301809],
dtype=float32)
Methoden und ihre Parameter
Im Folgenden sind die Methoden und ihre Parameter der Klasse mxnet.autogard.function aufgeführt:
Methoden und ihre Parameter | Definition |
---|---|
vorwärts (Köpfe [, head_grads, Retain_graph,…]) | Diese Methode wird für die Vorwärtsberechnung verwendet. |
rückwärts (Köpfe [, head_grads, Retain_graph,…]) | Diese Methode wird für die Rückwärtsberechnung verwendet. Es berechnet die Gradienten von Köpfen in Bezug auf zuvor markierte Variablen. Diese Methode verwendet so viele Eingaben wie die Vorwärtsausgabe. Es werden auch so viele NDArrays wie Forward-Eingaben zurückgegeben. |
get_symbol (x) | Diese Methode wird verwendet, um den aufgezeichneten Berechnungsverlauf als abzurufen Symbol. |
grad (Köpfe, Variablen [, head_grads,…]) | Diese Methode berechnet die Gradienten von Köpfen in Bezug auf Variablen. Nach der Berechnung werden Gradienten als neue NDArrays zurückgegeben, anstatt sie in variable.grad zu speichern. |
is_recording () | Mit Hilfe dieser Methode können wir den Status der Aufnahme und nicht der Aufnahme abrufen. |
is_training () | Mit Hilfe dieser Methode können wir den Status von Training und Vorhersage erhalten. |
mark_variables (Variablen, Gradienten [, grad_reqs]) | Diese Methode markiert NDArrays als Variablen, um den Gradienten für die Autogradierung zu berechnen. Diese Methode ist identisch mit der Funktion .attach_grad () in einer Variablen, aber der einzige Unterschied besteht darin, dass wir mit diesem Aufruf den Gradienten auf einen beliebigen Wert setzen können. |
Pause ([train_mode]) | Diese Methode gibt einen Bereichskontext zurück, der in der Anweisung 'with' für Codes verwendet werden soll, für die keine Gradienten berechnet werden müssen. |
Predict_Mode () | Diese Methode gibt einen Bereichskontext zurück, der in der Anweisung 'with' verwendet werden soll, in der das Vorwärtsdurchlaufverhalten auf den Inferenzmodus eingestellt ist, ohne die Aufzeichnungsstatus zu ändern. |
record ([train_mode]) | Es wird ein zurückgegeben autograd Aufzeichnungsbereichskontext, der in der Anweisung 'with' verwendet werden soll, und Erfassung von Code, für den Gradienten berechnet werden müssen. |
set_recording (is_recording) | Ähnlich wie bei is_recoring () können wir mit Hilfe dieser Methode den Status beim Aufzeichnen und nicht beim Aufzeichnen abrufen. |
set_training (is_training) | Ähnlich wie bei is_traininig () können wir mit Hilfe dieser Methode den Status auf Training oder Vorhersage setzen. |
train_mode () | Diese Methode gibt einen Bereichskontext zurück, der in der Anweisung 'with' verwendet werden soll, in der das Vorwärtsdurchlaufverhalten auf den Trainingsmodus eingestellt ist, ohne die Aufzeichnungsstatus zu ändern. |
Implementierungsbeispiel
Im folgenden Beispiel verwenden wir die Methode mxnet.autograd.grad (), um den Gradienten des Kopfes in Bezug auf Variablen zu berechnen.
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
Die Ausgabe wird unten erwähnt -
[
[3.7182817 3.7182817]
<NDArray 2 @cpu(0)>]
Wir können die Methode mxnet.autograd.predict_mode () verwenden, um einen Bereich zurückzugeben, der in der Anweisung 'with' verwendet werden soll.
with mx.autograd.record():
y = model(x)
with mx.autograd.predict_mode():
y = sampling(y)
backward([y])
mxnet.intializer
Dies ist die MXNet-API für den Wiegeinitialisierer. Es hat die folgenden Klassen -
Klassen und ihre Parameter
Es folgen die Methoden und ihre Parameter von mxnet.autogard.function Klasse:
Klassen und ihre Parameter | Definition |
---|---|
Bilinear() | Mit Hilfe dieser Klasse können wir das Gewicht für Up-Sampling-Schichten initialisieren. |
Konstanter Wert) | Diese Klasse initialisiert die Gewichte auf einen bestimmten Wert. Der Wert kann sowohl ein Skalar als auch ein NDArray sein, der der Form des einzustellenden Parameters entspricht. |
FusedRNN (init, num_hidden, num_layers, mode) | Wie der Name schon sagt, initialisiert diese Klasse Parameter für die verschmolzenen RNN-Schichten (Recurrent Neural Network). |
InitDesc | Es fungiert als Deskriptor für das Initialisierungsmuster. |
Initializer (** kwargs) | Dies ist die Basisklasse eines Initialisierers. |
LSTMBias ([forget_bias]) | Diese Klasse initialisiert alle Verzerrungen einer LSTMCell auf 0,0, mit Ausnahme des Vergessensgatters, dessen Verzerrung auf einen benutzerdefinierten Wert festgelegt ist. |
Laden (param [, default_init, verbose]) | Diese Klasse initialisiert die Variablen durch Laden von Daten aus einer Datei oder einem Wörterbuch. |
MSRAPrelu ([Faktor_Typ, Steigung]) | Wie der Name schon sagt, initialisiert diese Klasse das Gewicht gemäß einem MSRA-Papier. |
Gemischt (Muster, Initialisierer) | Die Parameter werden mit mehreren Initialisierern initialisiert. |
Normal ([Sigma]) | Die Klasse Normal () initialisiert Gewichte mit Zufallswerten, die aus einer Normalverteilung mit einem Mittelwert von Null und einer Standardabweichung (SD) von abgetastet wurden sigma. |
Einer() | Es initialisiert die Gewichtung des Parameters auf eins. |
Orthogonal ([scale, rand_type]) | Wie der Name schon sagt, initialisiert diese Klasse das Gewicht als orthogonale Matrix. |
Uniform ([Skala]) | Es initialisiert Gewichte mit zufälligen Werten, die gleichmäßig aus einem bestimmten Bereich abgetastet werden. |
Xavier ([rnd_type, factor_type, size]) | Es wird tatsächlich ein Initialisierer zurückgegeben, der die Xavier-Initialisierung für Gewichte durchführt. |
Null() | Es initialisiert die Gewichtung des Parameters auf Null. |
Implementierungsbeispiel
Im folgenden Beispiel verwenden wir die Klasse mxnet.init.Normal (), erstellen einen Initialisierer und rufen seine Parameter ab.
init = mx.init.Normal(0.8)
init.dumps()
Output
Die Ausgabe ist unten angegeben -
'["normal", {"sigma": 0.8}]'
Example
init = mx.init.Xavier(factor_type="in", magnitude=2.45)
init.dumps()
Output
Die Ausgabe wird unten gezeigt -
'["xavier", {"rnd_type": "uniform", "factor_type": "in", "magnitude": 2.45}]'
Im folgenden Beispiel verwenden wir die Klasse mxnet.initializer.Mixed (), um Parameter mit mehreren Initialisierern zu initialisieren.
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
Die Ausgabe wird unten gezeigt -
fullyconnected1_weight
[[ 0.0097627 0.01856892 0.04303787]]
fullyconnected1_bias
[ 0.]