Apache MXNet – API de Python ndarray

Este capítulo describe la biblioteca ndarray disponible en Apache MXNet.

Mxnet.ndarray

La biblioteca Apache MXNet NDArray define los DS (estructuras de datos) básicos para todos los cálculos matemáticos. Las dos tareas principales de NDArray son las siguientes:

  • Admite una ejecución rápida en una amplia gama de configuraciones de hardware.

  • Automáticamente paraleliza múltiples operaciones en hardware disponible.

El siguiente ejemplo muestra cómo puede crear un NDArray usando un «arreglo» 1-D y 2-D de una lista de Python normal.

import mxnet as mx
from mxnet import nd

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

Salida

El resultado se muestra a continuación:

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

Ejemplo

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)

Salida

Esto da el siguiente resultado:

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

Ahora, analicemos en detalle las clases, funciones y parámetros de ndarray de la API de MXNet.

Clases

La siguiente tabla consta de clases ndarray de la API de MXNet:

Clase Definición
CachedOp (sym[, flags]) Se utiliza para el identificador de instrucciones en caché.
NDArray (manejar[, writable]) Se utiliza como un objeto de matriz que representa una matriz uniforme y multidimensional de elementos de tamaño fijo.

Funciones y sus parámetros

A continuación se muestran algunas funciones importantes y sus parámetros cubiertos por la API mxnet.ndarray.

Función y sus parámetros Definición
Activación([data, act_type, out, name]) Aplica la función de activación a la entrada por etapas. Es compatible con las funciones de activación relu, sigmoid, tanh, softrelu, softsign.
BatchNorm([data, gamma, beta, moving_mean, …]) Se utiliza para la normalización de lotes. Esta función normaliza el paquete de datos a la media y la varianza. Aplica una escala gamma y una compensación beta.
Muestreador bilineal([data, grid, cudnn_off, …])

Esta función aplica muestreo bilineal al mapa de características de entrada. De hecho, esta es la clave de las «Redes de transformadores espaciales».

Si está familiarizado con la función de reasignación en OpenCV, el uso de esta función es muy similar a esto. La única diferencia es que tiene un pase hacia atrás.

BlockGrad ([data, out, name]) Como sugiere el nombre, esta función detiene el cálculo del gradiente. Básicamente, esto evita que el gradiente acumulado de la entrada retroceda a través de este operador.
Elenco([data, dtype, out, name]) Esta función convertirá todos los elementos de entrada a un nuevo tipo.

Ejemplos de implementación

En el siguiente ejemplo, usaremos la función BilinierSampler () para reducir los datos a la mitad y desplazar los datos horizontalmente en -1 píxel –

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)

Salida

Cuando ejecute el código anterior, debería ver el siguiente resultado:

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

El resultado anterior muestra una reducción del doble en los datos.

Un ejemplo de cambio de datos en -1 píxel se ve así:

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)

Salida

El resultado se enumera a continuación:

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

De manera similar, el siguiente ejemplo demuestra el uso de la función cast ():

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

Salida

Tras la ejecución, recibirá el siguiente resultado:

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

ndarray.contrib

Contrib API NDArray se define en el paquete ndarray.contrib. Por lo general, proporciona muchas API experimentales útiles para nuevas funciones. Esta API funciona para la comunidad donde pueden probar nuevas funciones. El autor de la función también recibirá comentarios.

Funciones y sus parámetros

A continuación se presentan algunas características importantes y sus opciones cubiertas API mxnet.ndarray.contrib

Función y sus parámetros Definición
rand_zipfian(clases_verdaderas, núm_muestreo,…) Esta función extrae muestras aleatorias de una distribución Zipf aproximada. La distribución subyacente de esta función es la distribución Zipf. Esta función selecciona aleatoriamente num_sampled candidatos, y los elementos sampled_candidates se toman de la distribución base anterior.
para todos(cuerpo, datos, init_states) Como sugiere el nombre, esta función inicia un bucle for con cálculo definido por el usuario sobre NDArrays para medir 0. Esta función simula un bucle for, y en el cuerpo hay un cálculo para iterar sobre el bucle for.
while_loop (cond, func, loop_vars[, …]) Como sugiere el nombre, esta función inicia un ciclo while con una evaluación definida por el usuario y una condición de ciclo. Esta función simula un ciclo while que realiza cálculos individuales de forma inteligente si se cumple una condición.
cond(anterior, luego_func, else_func) Como sugiere el nombre, esta función se ejecuta if-then-else utilizando condiciones y cálculos definidos por el usuario. Esta función simula una rama if-like que elige ejecutar uno de dos cálculos personalizados basados ​​en una condición especificada.
isinf(datos) Esta función realiza una verificación elemento por elemento para determinar si el NDArray contiene un elemento infinito o no.
Getnnz([data, axis, out, name]) Esta función nos da el número de valores almacenados para el tensor disperso. También incluye ceros explícitos. Solo admite la matriz CSR en la CPU.
retractarse[data, min_range, max_range, …]) Esta función requiere datos cuantificados a int32 y los umbrales correspondientes a int8 utilizando los umbrales mínimo y máximo calculados en tiempo de ejecución o basados ​​en la calibración.

Ejemplos de implementación

En el siguiente ejemplo, usaremos la función rand_zipfian para extraer muestras aleatorias de aproximadamente la distribución 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

Salida

Verá la siguiente salida:

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

Ejemplo

exp_count_true

Salida

El resultado se muestra a continuación:

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

Ejemplo

exp_count_sample

Salida

Esto da el siguiente resultado:

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

En el siguiente ejemplo, usaremos la función while_loop para ejecutar un ciclo while para cálculos personalizados y condiciones de ciclo:

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

Salida

El resultado se muestra a continuación:

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

Ejemplo

States

Salida

Esto da el siguiente resultado:

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

ndarray.image

La API de NDArray Imaging se define en el paquete ndarray.image. Como sugiere su nombre, se usa comúnmente para imágenes y sus funciones.

Funciones y sus parámetros

A continuación se presentan algunas características importantes y sus opciones cubiertas API mxnet.ndarray.image

Función y sus parámetros Definición
Ajustar_luz([data, alpha, out, name]) Como sugiere el nombre, esta función ajusta el nivel de iluminación de la entrada. Sigue el estilo AlexNet.
ciruela pasa([data, x, y, width, height, out, name]) Con esta función podemos recortar imágenes NDArray de forma (H x W x H) o (N x H x W x D) al tamaño especificado por el usuario.
normalizar([data, mean, std, out, name]) Normaliza un tensor de la forma (C x H x W) o (N x C x H x W) con tenga en cuenta y desviación estándar (SD)
cultivo_aleatorio ([data, xrange, yrange, width, …]) Al igual que la función crop (), recorta arbitrariamente el NDArray de una imagen de la forma (H x W x H) o (N x H x W x C) a un tamaño especificado por el usuario. El resultado se promoverá si el src es más pequeño que el tamaño.
iluminación_aleatoria([data, alpha_std, out, name]) Como sugiere el nombre, esta función agrega aleatoriamente ruido PCA. También sigue el estilo AlexNet.
recorte_resimensionado_aleatorio([data, xrange, yrange, …]) También recorta una imagen de forma arbitraria NDArray (H x W x H) o (N x H x W x H) a un tamaño específico. El resultado se promoverá si el src es más pequeño que el tamaño. Esto también aleatoriza el área y la relación de aspecto.
cambiar el tamaño([data, size, keep_ratio, interp, …]) Como sugiere el nombre, esta función cambiará el tamaño del NDArray de la imagen de la forma (H x W x H) o (N x H x W x D) al tamaño especificado por el usuario.
to_tensor([data, out, name]) Convierte imágenes NDArray de la forma (H x W x H) o (N x H x W x D) con valores en el rango [0, 255] en el tensor NDArray de la forma (C x H x W) o (N x C x H x W) con valores en el rango [0, 1]…

Ejemplos de implementación

En el siguiente ejemplo, usaremos la función to_tensor para transformar una imagen NDArray de la forma (H x W x D) o (N x H x W x C) con valores en el rango [0, 255] en el tensor NDArray de la forma (C x H x W) o (N x C x H x W) con valores en el rango [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)

Salida

Verá la siguiente salida:

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

Ejemplo

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

mx.nd.image.to_tensor(img)

Salida

Cuando ejecute el código, verá el siguiente resultado:

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

En el siguiente ejemplo, usaremos la función normalizar para normalizar el tensor de forma (C x H x W) o (N x C x H x W) con tenga en cuenta y desviación estándar (SD)

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

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

Salida

Esto da el siguiente resultado:

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

Ejemplo

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

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

Salida

Cuando ejecute el código anterior, debería ver el siguiente resultado:

[[[[ 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

La API Random NDArray se define en el paquete ndarray.random. Como su nombre indica, este es el generador de distribución aleatoria NDArray API MXNet.

Funciones y sus parámetros

A continuación se presentan algunas características importantes y sus opciones cubiertas API mxnet.ndarray.random

Función y sus parámetros Definición
un uniforme ([low, high, shape, dtype, ctx, out]) Genera muestras aleatorias a partir de una distribución uniforme.
normal([loc, scale, shape, dtype, ctx, out]) Genera muestras aleatorias a partir de una distribución normal (gaussiana).
randn (* formulario, ** kwargs) Genera muestras aleatorias a partir de una distribución normal (gaussiana).
exponencial[scale, shape, dtype, ctx, out]) Genera muestras a partir de una distribución exponencial.
gama([alpha, beta, shape, dtype, ctx, out]) Genera muestras aleatorias a partir de la distribución gamma.
polinomio (datos[, shape, get_prob, out, dtype]) Genera una muestra simultánea a partir de múltiples distribuciones polinómicas.
binomio_negativo ([k, p, shape, dtype, ctx, out]) Genera muestras aleatorias a partir de una distribución binomial negativa.
Binomial_negativo_generalizado ([mu, alpha, …]) Genera muestras aleatorias a partir de una distribución binomial negativa generalizada.
barajar (datos, ** kwargs) Mezcla los elementos de forma aleatoria.
randint (bajo, alto[, shape, dtype, ctx, out]) Genera muestras aleatorias a partir de una distribución uniforme discreta.
exponencial_como[data, lam, out, name]) Genera muestras aleatorias a partir de una distribución exponencial según la forma de la matriz de entrada.
gamma_like[data, alpha, beta, out, name]) Genera muestras aleatorias a partir de la distribución gamma de acuerdo con la forma de la matriz de entrada.
generalized_negative_binomial_like ([data, …]) Genera muestras aleatorias a partir de la distribución binomial negativa generalizada de acuerdo con la forma de la matriz de entrada.
negative_binomic_like[data, k, p, out, name]) Genera muestras aleatorias a partir de una distribución binomial negativa según la forma de la matriz de entrada.
normal_like[data, loc, scale, out, name]) Genera muestras aleatorias a partir de una distribución normal (gaussiana) de acuerdo con la forma de la matriz de entrada.
poisson_like[data, lam, out, name]) Genera muestras aleatorias a partir de la distribución de Poisson según la forma de la matriz de entrada.
uniforme_como[data, low, high, out, name]) Genera muestras aleatorias a partir de una distribución uniforme según la forma de la matriz de entrada.

Ejemplos de implementación

En el siguiente ejemplo, tomaremos muestras aleatorias de una distribución uniforme. Para ello, se utilizará la función un uniforme ()

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

Salida

El resultado se menciona a continuación:

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

Ejemplo

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

Salida

El resultado se da a continuación:

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

Ejemplo

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

Salida

Verá la siguiente salida:

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

En el siguiente ejemplo, vamos a extraer muestras aleatorias de la distribución binomial negativa generalizada. Para esto usaremos la función generalized_negative_binomial ()

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

Salida

Cuando ejecute el código anterior, debería ver el siguiente resultado:

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

Ejemplo

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

Salida

El resultado se presenta aquí:

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

Ejemplo

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)

Salida

A continuación se muestra la salida del código:

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

ndarray.utils

La utilidad de la API NDArray se define en el paquete ndarray.utils. Como sugiere el nombre, proporciona funciones de utilidad para NDArray y BaseSparseNDArray.

Funciones y sus parámetros

A continuación se presentan algunas características importantes y sus opciones cubiertas API mxnet.ndarray.utils

Función y sus parámetros Definición
ceros (forma[, ctx, dtype, stype]) Esta función devolverá una nueva matriz de la forma y el tipo dados, llena de ceros.
vacío (formulario[, ctx, dtype, stype]) Devolverá una nueva matriz de la forma y el tipo dados sin inicializar los registros.
matriz (matriz_origen[, ctx, dtype]) Como sugiere el nombre, esta función creará una matriz a partir de cualquier objeto que proporcione una interfaz de matriz.
descargar (nombre de archivo) Cargará una matriz desde un archivo.
load_frombuffer (buf) Como sugiere el nombre, esta función cargará un diccionario o una lista de matrices desde un búfer.
guardar (nombre, datos) Esta función guardará una lista de matrices o un diccionario str-> array en un archivo.

Ejemplos de implementación

En el siguiente ejemplo, devolveremos una nueva matriz de la forma y el tipo dados, llena de ceros. Para esto usaremos la función ceros ()

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

Salida

Esto da el siguiente resultado:

<CSRNDArray 1x2 @cpu(0)>

Ejemplo

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

Salida

Recibirá el siguiente resultado:

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

En el siguiente ejemplo, vamos a almacenar una lista de matrices y un diccionario de cadenas. Para esto usaremos la función salvar()

Ejemplo

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

Salida

Tras la ejecución, recibirá el siguiente resultado:

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

Ejemplo

mx.nd.load('my_dict')

Salida

El resultado se muestra a continuación:

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

🚫