Apache MXNet - Python API ndarray

Este capítulo explica a biblioteca ndarray que está disponível no Apache MXNet.

Mxnet.ndarray

A biblioteca NDArray do Apache MXNet define o núcleo DS (estruturas de dados) para todos os cálculos matemáticos. Duas tarefas fundamentais do NDArray são as seguintes -

  • Ele oferece suporte à execução rápida em uma ampla variedade de configurações de hardware.

  • Ele paralela automaticamente várias operações em todo o hardware disponível.

O exemplo dado abaixo mostra como se pode criar um NDArray usando 1-D e 2-D 'array' de uma lista Python regular -

import mxnet as mx
from mxnet import nd

x = nd.array([1,2,3,4,5,6,7,8,9,10])
print(x)

Output

O resultado é fornecido abaixo:

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

Example

y = nd.array([[1,2,3,4,5,6,7,8,9,10], [1,2,3,4,5,6,7,8,9,10], [1,2,3,4,5,6,7,8,9,10]])
print(y)

Output

Isso produz a seguinte saída -

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

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 de API ndarray de MXNet -

Classe Definição
CachedOp (sym [, sinalizadores]) É usado para identificador de operador em cache.
NDArray (identificador [, gravável]) É usado como um objeto de matriz que representa uma matriz homogênea e multidimensional de itens de tamanho fixo.

Funções e seus parâmetros

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

Função e seus parâmetros Definição
Activation([data, act_type, out, name]) Ele aplica uma função de ativação a nível de elemento à entrada. Suporta funções de ativação relu, sigmóide, tanh, softrelu e softsign.
BatchNorm([dados, gama, beta, média_movente, ...]) É usado para normalização de lote. Esta função normaliza um lote de dados por média e variância. Ele aplica uma escala gama e offset 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.

Exemplos de implementação

No exemplo abaixo, usaremos a função BilinierSampler () para diminuir o zoom dos dados duas vezes e deslocar os dados horizontalmente em -1 pixel -

import mxnet as mx
from mxnet import nd
data = nd.array([[[[2, 5, 3, 6],
   [1, 8, 7, 9],
   [0, 4, 1, 8],
   [2, 0, 3, 4]]]])
affine_matrix = nd.array([[2, 0, 0],
   [0, 2, 0]])

affine_matrix = nd.reshape(affine_matrix, shape=(1, 6))

grid = nd.GridGenerator(data=affine_matrix, transform_type='affine', target_shape=(4, 4))

output = nd.BilinearSampler(data, grid)

Output

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

[[[[0. 0. 0. 0. ]
   [0. 4.0000005 6.25 0. ]
   [0. 1.5 4. 0. ]
   [0. 0. 0. 0. ]]]]
<NDArray 1x1x4x4 @cpu(0)>

A saída acima mostra a redução dos dados duas vezes.

O exemplo de deslocamento dos dados em -1 pixel é o seguinte -

import mxnet as mx
from mxnet import nd
data = nd.array([[[[2, 5, 3, 6],
   [1, 8, 7, 9],
   [0, 4, 1, 8],
   [2, 0, 3, 4]]]])
warp_matrix = nd.array([[[[1, 1, 1, 1],
   [1, 1, 1, 1],
   [1, 1, 1, 1],
   [1, 1, 1, 1]],
   [[0, 0, 0, 0],
   [0, 0, 0, 0],
   [0, 0, 0, 0],
   [0, 0, 0, 0]]]])
grid = nd.GridGenerator(data=warp_matrix, transform_type='warp')
output = nd.BilinearSampler(data, grid)

Output

O resultado é declarado abaixo -

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

Da mesma forma, o exemplo a seguir mostra o uso da função cast () -

nd.cast(nd.array([300, 10.1, 15.4, -1, -2]), dtype='uint8')

Output

Após a execução, você receberá a seguinte saída -

[ 44 10 15 255 254]
<NDArray 5 @cpu(0)>

ndarray.contrib

A API Contrib NDArray é definida no pacote ndarray.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.ndarray.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, estados_init) Como o nome indica, essa função executa um loop for 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.
isinf(dados) Esta função executa uma verificação de elemento para determinar se o NDArray contém um elemento infinito ou não.
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.

Exemplos de implementação

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

import mxnet as mx
from mxnet import nd
trueclass = mx.nd.array([2])
samples, exp_count_true, exp_count_sample = mx.nd.contrib.rand_zipfian(trueclass, 3, 4)
samples

Output

Você verá a seguinte saída -

[0 0 1]
<NDArray 3 @cpu(0)>

Example

exp_count_true

Output

O resultado é fornecido abaixo:

[0.53624076]
<NDArray 1 @cpu(0)>

Example

exp_count_sample

Output

Isso produz a seguinte saída:

[1.29202967 1.29202967 0.75578891]
<NDArray 3 @cpu(0)>

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_var = (mx.nd.array([0], dtype="int64"), mx.nd.array([1], dtype="int64"))
outputs, states = mx.nd.contrib.while_loop(cond, func, loop_vars, max_iterations=10)
outputs

Output

O resultado é mostrado abaixo -

[
[[       1]
 [      2]
 [      4]
 [      7]
 [     11]
 [     16]
 [     22]
 [     29]
 [3152434450384]
 [     257]]
<NDArray 10x1 @cpu(0)>]

Example

States

Output

Isso produz a seguinte saída -

[
[8]
<NDArray 1 @cpu(0)>,
[29]
<NDArray 1 @cpu(0)>]

ndarray.image

A API Image NDArray é definida no pacote ndarray.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.ndarray.image API-

Função e seus parâmetros Definição
adjust_lighting([dados, alfa, saída, nome]) Como o nome indica, esta função ajusta o nível de iluminação da entrada. Segue o estilo AlexNet.
crop([dados, x, y, largura, altura, saída, nome]) Com a ajuda desta função, podemos recortar 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.
normalize([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 aumentará a amostra do resultado se src for menor que o tamanho.
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 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.nd.random.uniform(0, 255, (4, 2, 3)).astype(dtype=np.uint8)
mx.nd.image.to_tensor(img)

Output

Você verá a seguinte saída -

[[[0.972549 0.5058824 ]
   [0.6039216 0.01960784]
   [0.28235295 0.35686275]
   [0.11764706 0.8784314 ]]

[[0.8745098 0.9764706 ]
   [0.4509804 0.03529412]
   [0.9764706 0.29411766]
   [0.6862745 0.4117647 ]]

[[0.46666667 0.05490196]
   [0.7372549 0.4392157 ]
   [0.11764706 0.47843137]
   [0.31764707 0.91764706]]]
<NDArray 3x4x2 @cpu(0)>

Example

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

mx.nd.image.to_tensor(img)

Output

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

[[[[0.0627451 0.5647059 ]
[0.2627451 0.9137255 ]
[0.57254905 0.27450982]
[0.6666667 0.64705884]]
[[0.21568628 0.5647059 ]
[0.5058824 0.09019608]
[0.08235294 0.31764707]
[0.8392157 0.7137255 ]]
[[0.6901961 0.8627451 ]
[0.52156866 0.91764706]
[0.9254902 0.00784314]
[0.12941177 0.8392157 ]]]
[[[0.28627452 0.39607844]
[0.01960784 0.36862746]
[0.6745098 0.7019608 ]
[0.9607843 0.7529412 ]]
[[0.2627451 0.58431375]
[0.16470589 0.00392157]
[0.5686275 0.73333335]
[0.43137255 0.57254905]]
[[0.18039216 0.54901963]
[0.827451 0.14509805]
[0.26666668 0.28627452]
[0.24705882 0.39607844]]]]
<NDArgt;ray 2x3x4x2 @cpu(0)>

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.nd.random.uniform(0, 1, (3, 4, 2))

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

Output

Isso produz a seguinte saída -

[[[ 0.29391178 0.3218054 ]
[ 0.23084386 0.19615503]
[ 0.24175143 0.21988946]
[ 0.16710812 0.1777354 ]]
[[-0.02195817 -0.3847335 ]
[-0.17800489 -0.30256534]
[-0.28807247 -0.19059572]
[-0.19680339 -0.26256624]]
[[-1.9808068 -1.5298678 ]
[-1.6984252 -1.2839255 ]
[-1.3398265 -1.712009 ]
[-1.7099224 -1.6165378 ]]]
<NDArray 3x4x2 @cpu(0)>

Example

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

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

Output

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

[[[[ 2.0600514e-01 2.4972327e-01]
[ 1.4292289e-01 2.9281738e-01]
[ 4.5158025e-02 3.4287784e-02]
[ 9.9427439e-02 3.0791296e-02]]
[[-2.1501756e-01 -3.2297665e-01]
[-2.0456362e-01 -2.2409186e-01]
[-2.1283737e-01 -4.8318747e-01]
[-1.7339960e-01 -1.5519112e-02]]
[[-1.3478968e+00 -1.6790028e+00]
[-1.5685816e+00 -1.7787373e+00]
[-1.1034534e+00 -1.8587360e+00]
[-1.6324382e+00 -1.9027401e+00]]]
[[[ 1.4528830e-01 3.2801408e-01]
[ 2.9730779e-01 8.6780310e-02]
[ 2.6873133e-01 1.7900752e-01]
[ 2.3462953e-01 1.4930873e-01]]
[[-4.4988656e-01 -4.5021546e-01]
[-4.0258706e-02 -3.2384416e-01]
[-1.4287934e-01 -2.6537544e-01]
[-5.7649612e-04 -7.9429924e-02]]
[[-1.8505517e+00 -1.0953522e+00]
[-1.1318740e+00 -1.9624406e+00]
[-1.8375070e+00 -1.4916846e+00]
[-1.3844404e+00 -1.8331525e+00]]]]
<NDArray 2x3x4x2 @cpu(0)>

ndarray.random

A API Random NDArray é definida no pacote ndarray.random. Como o nome indica, é o gerador de distribuição aleatória NDArray 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.ndarray.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).
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 a partir 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 do array de entrada.
uniform_like ([dados, baixo, alto, fora, nome]) Ele gera amostras aleatórias a partir de uma distribuição uniforme, de acordo com a forma da matriz de entrada.

Exemplos de implementação

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

mx.nd.random.uniform(0, 1)

Output

O resultado é mencionado abaixo -

[0.12381998]
<NDArray 1 @cpu(0)>

Example

mx.nd.random.uniform(-1, 1, shape=(2,))

Output

O resultado é dado abaixo -

[0.558102 0.69601643]
<NDArray 2 @cpu(0)>

Example

low = mx.nd.array([1,2,3])
high = mx.nd.array([2,3,4])
mx.nd.random.uniform(low, high, shape=2)

Output

Você verá a seguinte saída -

[[1.8649333 1.8073189]
 [2.4113967 2.5691009]
 [3.1399727 3.4071832]]
<NDArray 3x2 @cpu(0)>

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

mx.nd.random.generalized_negative_binomial(10, 0.5)

Output

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

[1.]
<NDArray 1 @cpu(0)>

Example

mx.nd.random.generalized_negative_binomial(10, 0.5, shape=(2,))

Output

A saída é fornecida aqui -

[16. 23.]
<NDArray 2 @cpu(0)>

Example

mu = mx.nd.array([1,2,3])
alpha = mx.nd.array([0.2,0.4,0.6])
mx.nd.random.generalized_negative_binomial(mu, alpha, shape=2)

Output

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

[[0. 0.]
 [4. 1.]
 [9. 3.]]
<NDArray 3x2 @cpu(0)>

ndarray.utils

O utilitário NDArray API é definido no pacote ndarray.utils. Como o nome indica, ele fornece as funções de utilitário para NDArray e BaseSparseNDArray.

Funções e seus parâmetros

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

Função e seus parâmetros Definição
zeros (forma [, ctx, tipo d, tipo]) Esta função retornará um novo array de forma e tipo fornecidos, preenchido com zeros.
vazio (forma [, ctx, dtype, stype]) Ele retornará uma nova matriz com a forma e o tipo fornecidos, sem inicializar as entradas.
array (source_array [, ctx, dtype]) Como o nome indica, essa função criará um array a partir de qualquer objeto que exponha a interface do array.
carregar (fname) Ele irá carregar um array do arquivo.
load_frombuffer (buf) Como o nome indica, esta função irá carregar um dicionário de array ou lista de um buffer
salvar (fname, data) Esta função salvará uma lista de arrays ou um dicionário de str-> array para arquivo.

Exemplos de implementação

No exemplo abaixo, vamos retornar um novo array de forma e tipo fornecidos, preenchido com zeros. Para isso, estaremos usando a funçãozeros().

mx.nd.zeros((1,2), mx.cpu(), stype='csr')

Output

Isso produz a seguinte saída -

<CSRNDArray 1x2 @cpu(0)>

Example

mx.nd.zeros((1,2), mx.cpu(), 'float16', stype='row_sparse').asnumpy()

Output

Você receberá a seguinte saída -

array([[0., 0.]], dtype=float16)

No exemplo abaixo, vamos salvar uma lista de arrays e um dicionário de strings. Para isso, estaremos usando a funçãosave().

Example

x = mx.nd.zeros((2,3))
y = mx.nd.ones((1,4))
mx.nd.save('list', [x,y])
mx.nd.save('dict', {'x':x, 'y':y})
mx.nd.load('list')

Output

Após a execução, você receberá a seguinte saída -

[
[[0. 0. 0.]
[0. 0. 0.]]
<NDArray 2x3 @cpu(0)>,
[[1. 1. 1. 1.]]
<NDArray 1x4 @cpu(0)>]

Example

mx.nd.load('my_dict')

Output

O resultado é mostrado abaixo -

{'x':
[[0. 0. 0.]
[0. 0. 0.]]
<NDArray 2x3 @cpu(0)>, 'y':
[[1. 1. 1. 1.]]
<NDArray 1x4 @cpu(0)>}