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)>}