Apache MXNet - Símbolo da API Python

Neste capítulo, aprenderemos sobre uma interface no MXNet que é denominada como Símbolo.

Mxnet.ndarray

A API Symbol do Apache MXNet é uma interface para programação simbólica. Symbol API apresenta o uso do seguinte -

  • Gráficos computacionais

  • Uso de memória reduzido

  • Otimização da função pré-uso

O exemplo a seguir mostra como se pode criar uma expressão simples usando a API Symbol do MXNet -

Um NDArray usando 'array' 1-D e 2-D de uma lista Python regular -

import mxnet as mx
# Two placeholders namely x and y will be created with mx.sym.variable
x = mx.sym.Variable('x')
y = mx.sym.Variable('y')
# The symbol here is constructed using the plus ‘+’ operator.
z = x + y

Output

Você verá a seguinte saída -

<Symbol _plus0>

Example

(x, y, z)

Output

O resultado é dado abaixo -

(<Symbol x>, <Symbol y>, <Symbol _plus0>)

Agora vamos discutir em detalhes sobre as classes, funções e parâmetros da API ndarray do MXNet.

Aulas

A tabela a seguir consiste nas classes da API Symbol do MXNet -

Classe Definição
Símbolo (alça) Este símbolo de classe é o gráfico simbólico do Apache MXNet.

Funções e seus parâmetros

A seguir estão algumas das funções importantes e seus parâmetros cobertos pela API mxnet.Symbol -

Função e seus parâmetros Definição
Ativação ([data, act_type, out, name]) Ele aplica uma função de ativação a nível de elemento à entrada. Suportarelu, sigmoid, tanh, softrelu, softsign funções de ativação.
BatchNorm ([data, gamma, beta, moving_mean, ...]) É usado para normalização de lote. Esta função normaliza um lote de dados por média e variância. Aplica uma escalagamma e compensar beta.
BilinearSampler ([dados, grade, cudnn_off, ...]) Esta função aplica a amostragem bilinear ao mapa de características de entrada. Na verdade, é a chave das “Redes de Transformadores Espaciais”. Se você está familiarizado com a função de remapeamento em OpenCV, o uso desta função é bastante semelhante a isso. A única diferença é que ele tem o passe para trás.
BlockGrad ([data, out, name]) Como o nome especifica, esta função interrompe a computação de gradiente. Basicamente, impede que o gradiente acumulado das entradas flua através desse operador na direção inversa.
elenco ([data, dtype, out, name]) Esta função converterá todos os elementos da entrada para um novo tipo.
Esta função converterá todos os elementos da entrada para um novo tipo. Esta função, conforme o nome especificado, retorna um novo símbolo de forma e tipo dados, preenchido com zeros.
uns (forma [, tipo d]) Esta função, com o nome especificado, retorna um novo símbolo de forma e tipo dados, preenchido com uns.
completo (forma, val [, dtipo]) Esta função, conforme o nome especificado, retorna um novo array de forma e tipo dados, preenchido com o valor fornecido val.
arange (iniciar [, parar, passo, repetir, ...]) Ele retornará valores com espaçamento uniforme em um determinado intervalo. Os valores são gerados dentro do intervalo de meio aberto [iniciar, parar) o que significa que o intervalo incluistart mas exclui stop.
linspace (iniciar, parar, num [, ponto final, nome, ...]) Ele retornará números com espaçamento uniforme dentro de um intervalo especificado. Semelhante à função organize (), os valores são gerados dentro do intervalo de meia abertura [iniciar, parar) o que significa que o intervalo incluistart mas exclui stop.
histograma (a [, bins, intervalo]) Como o nome indica, esta função calculará o histograma dos dados de entrada.
potência (base, exp) Como o nome indica, esta função retornará o resultado elemento a elemento de base elemento elevado a potências de expelemento. Ambas as entradas, ou seja, base e exp, podem ser Symbol ou escalar. Aqui, observe que a transmissão não é permitida. Você pode usarbroadcast_pow se você quiser usar o recurso de transmissão.
SoftmaxActivation ([dados, modo, nome, atributo, saída]) Esta função aplica a ativação do softmax à entrada. Destina-se a camadas internas. Na verdade, está obsoleto, podemos usarsoftmax() em vez de.

Exemplos de implementação

No exemplo abaixo, estaremos usando a função power() que retornará o resultado do elemento sábio do elemento base elevado às potências do elemento exp:

import mxnet as mx
mx.sym.power(3, 5)

Output

Você verá a seguinte saída -

243

Example

x = mx.sym.Variable('x')
y = mx.sym.Variable('y')
z = mx.sym.power(x, 3)
z.eval(x=mx.nd.array([1,2]))[0].asnumpy()

Output

Isso produz a seguinte saída -

array([1., 8.], dtype=float32)

Example

z = mx.sym.power(4, y)
z.eval(y=mx.nd.array([2,3]))[0].asnumpy()

Output

Ao executar o código acima, você verá a seguinte saída -

array([16., 64.], dtype=float32)

Example

z = mx.sym.power(x, y)
z.eval(x=mx.nd.array([4,5]), y=mx.nd.array([2,3]))[0].asnumpy()

Output

O resultado é mencionado abaixo -

array([ 16., 125.], dtype=float32)

No exemplo abaixo, estaremos usando a função SoftmaxActivation() (or softmax()) que será aplicado à entrada e se destina a camadas internas.

input_data = mx.nd.array([[2., 0.9, -0.5, 4., 8.], [4., -.7, 9., 2., 0.9]])
soft_max_act = mx.nd.softmax(input_data)
print (soft_max_act.asnumpy())

Output

Você verá a seguinte saída -

[[2.4258138e-03 8.0748333e-04 1.9912292e-04 1.7924475e-02 9.7864312e-01]
[6.6843745e-03 6.0796250e-05 9.9204916e-01 9.0463174e-04 3.0112563e-04]]

symbol.contrib

A API Contrib NDArray é definida no pacote symbol.contrib. Normalmente, ele fornece muitas APIs experimentais úteis para novos recursos. Esta API funciona como um local para a comunidade onde eles podem experimentar os novos recursos. O colaborador do recurso também receberá o feedback.

Funções e seus parâmetros

A seguir estão algumas das funções importantes e seus parâmetros cobertos por mxnet.symbol.contrib API -

Função e seus parâmetros Definição
rand_zipfian (true_classes, num_sampled, ...) Esta função extrai amostras aleatórias de uma distribuição aproximadamente Zipfian. A distribuição básica desta função é a distribuição Zipfian. Esta função amostra aleatoriamente num_sampled candidatos e os elementos de sampled_candidates são extraídos da distribuição de base fornecida acima.
foreach (corpo, dados, init_states) Como o nome indica, essa função executa um loop com computação definida pelo usuário sobre NDArrays na dimensão 0. Essa função simula um loop for e o corpo tem o cálculo para uma iteração do loop for.
while_loop (cond, func, loop_vars [, ...]) Como o nome indica, esta função executa um loop while com computação definida pelo usuário e condição de loop. Esta função simula um loop while que literalmente faz cálculos personalizados se a condição for satisfeita.
cond (pred, then_func, else_func) Como o nome indica, essa função executa um if-then-else usando condição e computação definidas pelo usuário. Esta função simula uma ramificação semelhante a if que escolhe fazer um dos dois cálculos personalizados de acordo com a condição especificada.
getnnz ([dados, eixo, saída, nome]) Esta função nos dá o número de valores armazenados para um tensor esparso. Também inclui zeros explícitos. Ele suporta apenas matriz CSR na CPU.
requantize ([data, min_range, max_range,…]) Esta função requantiza os dados fornecidos que são quantizados em int32 e os limites correspondentes, em int8, usando os limites mínimo e máximo calculados em tempo de execução ou a partir da calibração.
index_copy ([old_tensor, index_vector, ...]) Esta função copia os elementos de um new_tensor into the old_tensor by selecting the indices in the order given in index. The output of this operator will be a new tensor that contains the rest elements of old tensor and the copied elements of new tensor.
interleaved_matmul_encdec_qk ([consultas,…]) Este operador calcula a multiplicação da matriz entre as projeções de consultas e chaves no uso de atenção múltipla como codificador-decodificador. A condição é que as entradas sejam um tensor de projeções de consultas que seguem o layout: (comprimento_seq, tamanho_do_ lote, número_de_heads *, head_dim).

Exemplos de implementação

No exemplo abaixo, usaremos a função rand_zipfian para extrair amostras aleatórias de uma distribuição aproximadamente Zipfian -

import mxnet as mx
true_cls = mx.sym.Variable('true_cls')
samples, exp_count_true, exp_count_sample = mx.sym.contrib.rand_zipfian(true_cls, 5, 6)
samples.eval(true_cls=mx.nd.array([3]))[0].asnumpy()

Output

Você verá a seguinte saída -

array([4, 0, 2, 1, 5], dtype=int64)

Example

exp_count_true.eval(true_cls=mx.nd.array([3]))[0].asnumpy()

Output

O resultado é mencionado abaixo -

array([0.57336551])

Example

exp_count_sample.eval(true_cls=mx.nd.array([3]))[0].asnumpy()

Output

Você verá a seguinte saída -

array([1.78103594, 0.46847373, 1.04183923, 0.57336551, 1.04183923])

No exemplo abaixo, estaremos usando a função while_loop para executar um loop while para computação definida pelo usuário e condição de loop -

cond = lambda i, s: i <= 7
func = lambda i, s: ([i + s], [i + 1, s + i])
loop_vars = (mx.sym.var('i'), mx.sym.var('s'))
outputs, states = mx.sym.contrib.while_loop(cond, func, loop_vars, max_iterations=10)
print(outputs)

Output

O resultado é fornecido abaixo:

[<Symbol _while_loop0>]

Example

Print(States)

Output

Isso produz a seguinte saída -

[<Symbol _while_loop0>, <Symbol _while_loop0>]

No exemplo abaixo, estaremos usando a função index_copy que copia os elementos de new_tensor para o old_tensor.

import mxnet as mx
a = mx.nd.zeros((6,3))
b = mx.nd.array([[1,2,3],[4,5,6],[7,8,9]])
index = mx.nd.array([0,4,2])
mx.nd.contrib.index_copy(a, index, b)

Output

Ao executar o código acima, você verá a seguinte saída -

[[1. 2. 3.]
[0. 0. 0.]
[7. 8. 9.]
[0. 0. 0.]
[4. 5. 6.]
[0. 0. 0.]]
<NDArray 6x3 @cpu(0)>

symbol.image

A API Image Symbol é definida no pacote symbol.image. Como o nome indica, normalmente é usado para imagens e seus recursos.

Funções e seus parâmetros

A seguir estão algumas das funções importantes e seus parâmetros cobertos por mxnet.symbol.image API -

Função e seus parâmetros Definição
Adjust_lighting ([data, alpha, out, name]) Como o nome indica, esta função ajusta o nível de iluminação da entrada. Segue o estilo AlexNet.
cortar ([dados, x, y, largura, altura, saída, nome]) Com a ajuda desta função, podemos cortar uma imagem NDArray de forma (A x L x C) ou (N x A x L x C) para o tamanho fornecido pelo usuário.
normalizar ([dados, média, padrão, saída, nome]) Ele normalizará um tensor de forma (C x H x W) ou (N x C x H x W) com mean e standard deviation(SD).
random_crop ([data, xrange, yrange, width, ...]) Semelhante a crop (), ele corta aleatoriamente uma imagem NDArray de forma (A x L x C) ou (N x A x L x C) para o tamanho fornecido pelo usuário. Isso vai aumentar a amostra do resultado sesrc é menor que o size.
random_lighting([dados, alfa_std, saída, nome]) Como o nome indica, esta função adiciona o ruído PCA aleatoriamente. Também segue o estilo AlexNet.
random_resized_crop ([data, xrange, yrange, ...]) Ele também recorta uma imagem aleatoriamente NDArray de forma (A x L x C) ou (N x A x L x C) para o tamanho fornecido. Isso aumentará a amostra do resultado se src for menor que o tamanho. Ele irá randomizar a área e a proporção de aspecto também.
resize ([data, size, keep_ratio, interp, ...]) Como o nome indica, esta função irá redimensionar um NDArray de imagem de forma (A x L x C) ou (N x A x L x C) para o tamanho fornecido pelo usuário.
to_tensor ([dados, saída, nome]) Ele converte uma imagem NDArray de forma (H x W x C) ou (N x A x W x C) com os valores no intervalo [0, 255] em um tensor NDArray de forma (C x H x W) ou ( N x C x H x W) com os valores no intervalo [0, 1].

Exemplos de implementação

No exemplo abaixo, estaremos usando a função to_tensor para converter NDArray de imagem de forma (H x W x C) ou (N x H x W x C) com os valores no intervalo [0, 255] para um tensor NDArray de forma (C x H x W) ou (N x C x A x W) com os valores no intervalo [0, 1].

import numpy as np

img = mx.sym.random.uniform(0, 255, (4, 2, 3)).astype(dtype=np.uint8)

mx.sym.image.to_tensor(img)

Output

O resultado é declarado abaixo -

<Symbol to_tensor4>

Example

img = mx.sym.random.uniform(0, 255, (2, 4, 2, 3)).astype(dtype=np.uint8)

mx.sym.image.to_tensor(img)

Output

A saída é mencionada abaixo:

<Symbol to_tensor5>

No exemplo abaixo, estaremos usando a função normalize () para normalizar um tensor de forma (C x H x W) ou (N x C x H x W) com mean e standard deviation(SD).

img = mx.sym.random.uniform(0, 1, (3, 4, 2))

mx.sym.image.normalize(img, mean=(0, 1, 2), std=(3, 2, 1))

Output

A seguir está a saída do código -

<Symbol normalize0>

Example

img = mx.sym.random.uniform(0, 1, (2, 3, 4, 2))

mx.sym.image.normalize(img, mean=(0, 1, 2), std=(3, 2, 1))

Output

O resultado é mostrado abaixo -

<Symbol normalize1>

symbol.random

A API Random Symbol é definida no pacote symbol.random. Como o nome indica, é o gerador de distribuição aleatória Symbol API do MXNet.

Funções e seus parâmetros

A seguir estão algumas das funções importantes e seus parâmetros cobertos por mxnet.symbol.random API -

Função e seus parâmetros Definição
uniforme ([baixo, alto, forma, tipo d, ctx, fora]) Ele gera amostras aleatórias de uma distribuição uniforme.
normal ([local, escala, forma, tipo d, ctx, saída]) Ele gera amostras aleatórias de uma distribuição normal (Gaussiana).
randn (* forma, ** kwargs) Ele gera amostras aleatórias de uma distribuição normal (Gaussiana).
poisson ([lam, shape, dtype, ctx, out]) Ele gera amostras aleatórias de uma distribuição de Poisson.
exponencial ([escala, forma, tipo d, ctx, saída]) Ele gera amostras de uma distribuição exponencial.
gama ([alfa, beta, forma, tipo d, ctx, saída]) Ele gera amostras aleatórias de uma distribuição gama.
multinomial (dados [, forma, get_prob, out, dtype]) Ele gera amostragem simultânea de várias distribuições multinomiais.
binomial_ negativo ([k, p, forma, tipo d, ctx, saída]) Ele gera amostras aleatórias de uma distribuição binomial negativa.
generalized_negative_binomial ([mu, alpha, ...]) Ele gera amostras aleatórias de uma distribuição binomial negativa generalizada.
embaralhar (dados, ** kwargs) Ele embaralha os elementos aleatoriamente.
randint (baixo, alto [, forma, tipo d, ctx, fora]) Ele gera amostras aleatórias de uma distribuição uniforme discreta.
exponential_like ([data, lam, out, name]) Ele gera amostras aleatórias de uma distribuição exponencial de acordo com a forma da matriz de entrada.
gamma_like ([dados, alfa, beta, saída, nome]) Ele gera amostras aleatórias de uma distribuição gama de acordo com a forma da matriz de entrada.
generalized_negative_binomial_like ([dados, ...]) Ele gera amostras aleatórias de uma distribuição binomial negativa generalizada de acordo com a forma da matriz de entrada.
negative_binomial_like ([data, k, p, out, name]) Ele gera amostras aleatórias de uma distribuição binomial negativa de acordo com a forma da matriz de entrada.
normal_like ([dados, loc, escala, saída, nome]) Ele gera amostras aleatórias de uma distribuição normal (Gaussiana) de acordo com a forma da matriz de entrada.
poisson_like ([data, lam, out, name]) Ele gera amostras aleatórias de uma distribuição de Poisson de acordo com a forma da matriz de entrada.
uniform_like ([dados, baixo, alto, fora, nome]) Ele gera amostras aleatórias de uma distribuição uniforme de acordo com a forma da matriz de entrada.

Exemplos de implementação

No exemplo abaixo, vamos embaralhar os elementos aleatoriamente usando a função shuffle (). Ele embaralhará a matriz ao longo do primeiro eixo.

data = mx.nd.array([[0, 1, 2], [3, 4, 5], [6, 7, 8],[9,10,11]])
x = mx.sym.Variable('x')
y = mx.sym.random.shuffle(x)
y.eval(x=data)

Output

Você verá a seguinte saída:

[
[[ 9. 10. 11.]
[ 0. 1. 2.]
[ 6. 7. 8.]
[ 3. 4. 5.]]
<NDArray 4x3 @cpu(0)>]

Example

y.eval(x=data)

Output

Ao executar o código acima, você verá a seguinte saída -

[
[[ 6. 7. 8.]
[ 0. 1. 2.]
[ 3. 4. 5.]
[ 9. 10. 11.]]
<NDArray 4x3 @cpu(0)>]

No exemplo abaixo, vamos extrair amostras aleatórias de uma distribuição binomial negativa generalizada. Para isso estarei usando a funçãogeneralized_negative_binomial().

mx.sym.random.generalized_negative_binomial(10, 0.1)

Output

O resultado é dado abaixo -

<Symbol _random_generalized_negative_binomial0>

symbol.sparse

O Sparse Symbol API é definido no pacote mxnet.symbol.sparse. Como o nome indica, ele fornece gráficos de rede neural esparsos e autodiferenciação na CPU.

Funções e seus parâmetros

A seguir estão algumas das funções importantes (inclui rotinas de criação de símbolos, rotinas de manipulação de símbolos, funções matemáticas, função trigonométrica, funções hiperbólicas, funções de redução, arredondamento, poderes, rede neural) e seus parâmetros cobertos por mxnet.symbol.sparse API -

Função e seus parâmetros Definição
ElementWiseSum (* args, ** kwargs) Esta função irá adicionar todos os argumentos de entrada em termos de elemento. Por exemplo, _ (1,2,… = 1 + 2 + ⋯ +). Aqui, podemos ver que add_n é potencialmente mais eficiente do que chamar add por n vezes.
Incorporação ([dados, peso, entrada_dim, ...]) Ele mapeará os índices inteiros para representações vetoriais, ou seja, embeddings. Na verdade, ele mapeia palavras para vetores de valor real em um espaço de alta dimensão, que é chamado de embeddings de palavras.
LinearRegressionOutput ([data, label, ...]) Ele calcula e otimiza a perda quadrática durante a propagação para trás, fornecendo apenas dados de saída durante a propagação para frente.
LogisticRegressionOutput ([data, label, ...]) Aplica uma função logística que também é chamada de função sigmóide à entrada. A função é calculada como 1/1 + exp (−x).
MAERegressionOutput ([data, label, ...]) Este operador calcula o erro absoluto médio da entrada. MAE é na verdade uma métrica de risco correspondente ao valor esperado do erro absoluto.
abs ([data, name, attr, out]) Como o nome indica, esta função retornará o valor absoluto elemento a elemento da entrada.
adagrad_update ([peso, graduação, história, lr, ...]) É uma função de atualização para AdaGrad optimizer.
adam_update ([weight, grad, mean, var, lr, ...]) É uma função de atualização para Adam optimizer.
add_n (* args, ** kwargs) Como o nome indica, ele adicionará todos os argumentos de entrada a nível de elemento.
arccos ([data, name, attr, out]) Esta função retornará cosseno inverso elemento a elemento da matriz de entrada.
ponto ([lhs, rhs, transpose_a, transpose_b, ...]) Como o nome indica, ele fornecerá o produto escalar de duas matrizes. Dependerá da dimensão da matriz de entrada: 1-D: produto interno dos vetores 2-D: multiplicação da matriz ND: Um produto da soma sobre o último eixo da primeira entrada e o primeiro eixo da segunda entrada.
elemwise_add ([lhs, rhs, name, attr, out]) Como o nome indica, vai add argumentos elemento sábio.
elemwise_div ([lhs, rhs, nome, attr, out]) Como o nome indica, vai divide argumentos elemento sábio.
elemwise_mul ([lhs, rhs, nome, attr, out]) Como o nome indica, vai Multiply argumentos elemento sábio.
elemwise_sub ([lhs, rhs, nome, attr, out]) Como o nome indica, ele subtrairá os argumentos em termos de elemento.
exp ([data, name, attr, out]) Esta função retornará o valor exponencial elemento a elemento da entrada fornecida.
sgd_update ([peso, grad, lr, wd, ...]) Ele atua como uma função de atualização para o otimizador Stochastic Gradient Descent.
sigmóide ([data, name, attr, out]) Como o nome indica, irá computar sigmoid de x elemento sábio.
sinal ([data, name, attr, out]) Ele retornará o sinal do elemento sábio da entrada fornecida.
sin ([data, name, attr, out]) Como o nome indica, esta função calculará o seno do elemento sábio da matriz de entrada fornecida.

Exemplo de Implementação

No exemplo abaixo, vamos embaralhar os elementos aleatoriamente usando ElementWiseSum()função. Ele irá mapear índices inteiros para representações vetoriais, ou seja, embeddings de palavras.

input_dim = 4
output_dim = 5

Example

/* Here every row in weight matrix y represents a word. So, y = (w0,w1,w2,w3)
y = [[ 0., 1., 2., 3., 4.],
[ 5., 6., 7., 8., 9.],
[ 10., 11., 12., 13., 14.],
[ 15., 16., 17., 18., 19.]]
/* Here input array x represents n-grams(2-gram). So, x = [(w1,w3), (w0,w2)]
x = [[ 1., 3.],
[ 0., 2.]]
/* Now, Mapped input x to its vector representation y.
Embedding(x, y, 4, 5) = [[[ 5., 6., 7., 8., 9.],
[ 15., 16., 17., 18., 19.]],
[[ 0., 1., 2., 3., 4.],
[ 10., 11., 12., 13., 14.]]]