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