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.]