Apache MXNet - API de Python ndarray
Este capítulo explica la biblioteca ndarray que está disponible en Apache MXNet.
Mxnet.ndarray
La biblioteca NDArray de Apache MXNet define el núcleo DS (estructuras de datos) para todos los cálculos matemáticos. Dos trabajos fundamentales de NDArray son los siguientes:
Admite una ejecución rápida en una amplia gama de configuraciones de hardware.
Automáticamente establece en paralelo múltiples operaciones en el hardware disponible.
El ejemplo que se muestra a continuación muestra cómo se puede crear un NDArray utilizando una 'matriz' 1-D y 2-D de una lista normal de Python:
import mxnet as mx
from mxnet import nd
x = nd.array([1,2,3,4,5,6,7,8,9,10])
print(x)
Output
La salida se da a continuación:
[ 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
Esto produce la siguiente salida:
[[ 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 sobre las clases, funciones y parámetros de la API ndarray de MXNet.
Clases
La siguiente tabla consta de las clases de API ndarray de MXNet:
Clase | Definición |
---|---|
CachedOp (sym [, flags]) | Se utiliza para el identificador de operador en caché. |
NDArray (manejar [, escribible]) | Se utiliza como un objeto de matriz que representa una matriz homogénea y multidimensional de elementos de tamaño fijo. |
Funciones y sus parámetros
A continuación se muestran algunas de las funciones importantes y sus parámetros cubiertos por la API mxnet.ndarray:
Función y sus parámetros | Definición |
---|---|
Activation([data, act_type, out, name]) | Aplica una función de activación por elementos a la entrada. 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 un lote de datos por media y varianza. Aplica una escala gamma y una compensación beta. |
BilinearSampler([datos, cuadrícula, cudnn_off,…]) |
Esta función aplica muestreo bilineal al mapa de características de entrada. En realidad, 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 bastante similar a eso. La única diferencia es que tiene el pase hacia atrás. |
BlockGrad ([datos, salida, nombre]) | Como el nombre lo especifica, esta función detiene el cálculo del gradiente. Básicamente evita que el gradiente acumulado de las entradas fluya a través de este operador en dirección hacia atrás. |
emitir ([data, dtype, out, name]) | Esta función convertirá todos los elementos de la entrada a un nuevo tipo. |
Ejemplos de implementación
En el siguiente ejemplo, usaremos la función BilinierSampler () para alejar los datos dos veces 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)
Output
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)>
La salida anterior muestra el alejamiento de los datos dos veces.
Un ejemplo de desplazamiento de los datos en -1 píxel es el siguiente:
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
La salida se indica 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 muestra el uso de la función cast ():
nd.cast(nd.array([300, 10.1, 15.4, -1, -2]), dtype='uint8')
Output
Tras la ejecución, recibirá el siguiente resultado:
[ 44 10 15 255 254]
<NDArray 5 @cpu(0)>
ndarray.contrib
La API Contrib NDArray se define en el paquete ndarray.contrib. Por lo general, proporciona muchas API experimentales útiles para nuevas funciones. Esta API funciona como un lugar para la comunidad donde pueden probar las nuevas funciones. El colaborador de funciones también recibirá comentarios.
Funciones y sus parámetros
A continuación se presentan algunas de las funciones importantes y sus parámetros cubiertos por mxnet.ndarray.contrib API -
Función y sus parámetros | Definición |
---|---|
rand_zipfian(true_classes, num_sampled,…) | Esta función extrae muestras aleatorias de una distribución aproximadamente Zipfian. La distribución base de esta función es la distribución Zipfian. Esta función muestrea aleatoriamente num_sampled candidatos y los elementos de sampled_candidates se extraen de la distribución base dada anteriormente. |
foreach(cuerpo, datos, init_states) | Como su nombre lo indica, esta función ejecuta un bucle for con cálculo definido por el usuario sobre NDArrays en la dimensión 0. Esta función simula un bucle for y el cuerpo tiene el cálculo para una iteración del bucle for. |
while_loop (cond, func, loop_vars [,…]) | Como su nombre lo indica, esta función ejecuta un ciclo while con cálculo definido por el usuario y condición de ciclo. Esta función simula un bucle while que literalmente realiza cálculos personalizados si se cumple la condición. |
cond(pred, luego_func, else_func) | Como su nombre lo indica, esta función ejecuta un if-then-else utilizando condiciones y cálculos definidos por el usuario. Esta función simula una rama if-like que elige hacer uno de los dos cálculos personalizados de acuerdo con la condición especificada. |
isinf(datos) | Esta función realiza una verificación de elementos para determinar si el NDArray contiene un elemento infinito o no. |
getnnz([datos, eje, salida, nombre]) | Esta función nos da el número de valores almacenados para un tensor escaso. También incluye ceros explícitos. Solo es compatible con la matriz CSR en la CPU. |
volver a cuantificar ([datos, rango_mínimo, rango_máximo,…]) | Esta función recuantifica los datos dados que se cuantifican en int32 y los umbrales correspondientes, en int8 utilizando los umbrales mínimo y máximo calculados en tiempo de ejecución o a partir de la calibración. |
Ejemplos de implementación
En el siguiente ejemplo, usaremos la función rand_zipfian para extraer muestras aleatorias de una distribución 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
Verá la siguiente salida:
[0 0 1]
<NDArray 3 @cpu(0)>
Example
exp_count_true
Output
La salida se da a continuación:
[0.53624076]
<NDArray 1 @cpu(0)>
Example
exp_count_sample
Output
Esto produce la siguiente salida:
[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 el cálculo definido por el usuario y la condición del 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
Output
La salida se muestra a continuación:
[
[[ 1]
[ 2]
[ 4]
[ 7]
[ 11]
[ 16]
[ 22]
[ 29]
[3152434450384]
[ 257]]
<NDArray 10x1 @cpu(0)>]
Example
States
Output
Esto produce la siguiente salida:
[
[8]
<NDArray 1 @cpu(0)>,
[29]
<NDArray 1 @cpu(0)>]
ndarray.image
La API Image NDArray se define en el paquete ndarray.image. Como su nombre lo indica, generalmente se usa para imágenes y sus características.
Funciones y sus parámetros
A continuación se muestran algunas de las funciones importantes y sus parámetros cubiertos por mxnet.ndarray.image API-
Función y sus parámetros | Definición |
---|---|
adjust_lighting([data, alpha, out, name]) | Como su nombre lo indica, esta función ajusta el nivel de iluminación de la entrada. Sigue el estilo AlexNet. |
crop([datos, x, y, ancho, alto, fuera, nombre]) | Con la ayuda de esta función, podemos recortar una imagen NDArray de forma (H x W x C) o (N x H x W x C) al tamaño dado por el usuario. |
normalize([data, mean, std, out, name]) | Normalizará un tensor de forma (C x H x W) o (N x C x H x W) con mean y standard deviation(SD). |
random_crop ([datos, rango x, rango y, ancho,…]) | Similar a crop (), recorta aleatoriamente una imagen NDArray de forma (H x W x C) o (N x H x W x C) al tamaño dado por el usuario. Hará una muestra superior del resultado si src es más pequeño que el tamaño. |
random_lighting([data, alpha_std, out, name]) | Como su nombre lo indica, esta función agrega el ruido PCA de forma aleatoria. También sigue el estilo AlexNet. |
random_resized_crop([data, xrange, yrange,…]) | También recorta una imagen aleatoriamente NDArray de forma (H x W x C) o (N x H x W x C) al tamaño dado. Hará una muestra superior del resultado, si src es más pequeño que el tamaño. También aleatorizará el área y la relación de aspecto. |
resize([data, size, keep_ratio, interp,…]) | Como su nombre lo indica, esta función cambiará el tamaño de una imagen NDArray de forma (H x W x C) o (N x H x W x C) al tamaño dado por el usuario. |
to_tensor([datos, fuera, nombre]) | Convierte una imagen NDArray de forma (H x W x C) o (N x H x W x C) con los valores en el rango [0, 255] en un tensor NDArray de forma (C x H x W) o ( N x C x H x W) con los valores en el rango [0, 1]. |
Ejemplos de implementación
En el siguiente ejemplo, usaremos la función to_tensor para convertir la imagen NDArray de forma (H x W x C) o (N x H x W x C) con los valores en el rango [0, 255] a un tensor NDArray de forma (C x H x W) o (N x C x H x W) con los 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)
Output
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)>
Example
img = mx.nd.random.uniform(0, 255, (2, 4, 2, 3)).astype(dtype=np.uint8)
mx.nd.image.to_tensor(img)
Output
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 normalize para normalizar un tensor de forma (C x H x W) o (N x C x H x W) con mean y 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
Esto produce la siguiente salida:
[[[ 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
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 lo indica, es el generador de distribución aleatoria NDArray API de MXNet.
Funciones y sus parámetros
A continuación se presentan algunas de las funciones importantes y sus parámetros cubiertos por mxnet.ndarray.random API -
Función y sus parámetros | Definición |
---|---|
uniforme ([bajo, alto, forma, 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 (* forma, ** kwargs) | Genera muestras aleatorias a partir de una distribución normal (gaussiana). |
exponencial ([escala, forma, dtype, ctx, out]) | Genera muestras a partir de una distribución exponencial. |
gamma ([alpha, beta, shape, dtype, ctx, out]) | Genera muestras aleatorias a partir de una distribución gamma. |
multinomial (datos [, forma, get_prob, out, dtype]) | Genera muestreo concurrente a partir de múltiples distribuciones multinomiales. |
binomio_negativo ([k, p, forma, tipo d, ctx, salida]) | Genera muestras aleatorias a partir de una distribución binomial negativa. |
generalized_negative_binomial ([mu, alpha,…]) | Genera muestras aleatorias a partir de una distribución binomial negativa generalizada. |
barajar (datos, ** kwargs) | Mezcla los elementos al azar. |
randint (bajo, alto [, forma, tipo d, ctx, fuera]) | Genera muestras aleatorias a partir de una distribución uniforme discreta. |
exponencial_como ([datos, lam, fuera, nombre]) | Genera muestras aleatorias a partir de una distribución exponencial según la forma de la matriz de entrada. |
gamma_like ([datos, alfa, beta, fuera, nombre]) | Genera muestras aleatorias a partir de una distribución gamma de acuerdo con la forma de la matriz de entrada. |
generalized_negative_binomial_like ([datos,…]) | Genera muestras aleatorias a partir de una distribución binomial negativa generalizada, según la forma de la matriz de entrada. |
negative_binomial_like ([datos, k, p, fuera, nombre]) | 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), según la forma de la matriz de entrada. |
poisson_like ([datos, lam, fuera, nombre]) | Genera muestras aleatorias a partir de una distribución de Poisson, según la forma de la matriz de entrada. |
uniform_like ([datos, bajo, alto, fuera, nombre]) | 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, vamos a extraer muestras aleatorias de una distribución uniforme. Para esto usaremos la funciónuniform().
mx.nd.random.uniform(0, 1)
Output
La salida se menciona a continuación:
[0.12381998]
<NDArray 1 @cpu(0)>
Example
mx.nd.random.uniform(-1, 1, shape=(2,))
Output
La salida se da a continuación:
[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
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 una distribución binomial negativa generalizada. Para esto, usaremos la funcióngeneralized_negative_binomial().
mx.nd.random.generalized_negative_binomial(10, 0.5)
Output
Cuando ejecute el código anterior, debería ver el siguiente resultado:
[1.]
<NDArray 1 @cpu(0)>
Example
mx.nd.random.generalized_negative_binomial(10, 0.5, shape=(2,))
Output
La salida se da a continuación:
[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 continuación se muestra la salida del código:
[[0. 0.]
[4. 1.]
[9. 3.]]
<NDArray 3x2 @cpu(0)>
ndarray.utils
La utilidad NDArray API se define en el paquete ndarray.utils. Como su nombre lo indica, proporciona las funciones de utilidad para NDArray y BaseSparseNDArray.
Funciones y sus parámetros
A continuación se presentan algunas de las funciones importantes y sus parámetros cubiertos por mxnet.ndarray.utils API -
Función y sus parámetros | Definición |
---|---|
ceros (forma [, ctx, dtype, stype]) | Esta función devolverá una nueva matriz de forma y tipo dados, llena de ceros. |
vacío (forma [, ctx, dtype, stype]) | Devolverá una nueva matriz de forma y tipo dados, sin inicializar entradas. |
matriz (matriz_origen [, ctx, dtype]) | Como su nombre lo indica, esta función creará una matriz a partir de cualquier objeto que exponga la interfaz de la matriz. |
cargar (fname) | Cargará una matriz desde el archivo. |
load_frombuffer (buf) | Como su nombre lo indica, esta función cargará un diccionario de matriz o una lista desde un búfer |
guardar (fname, datos) | Esta función guardará una lista de matrices o un dict of str-> array en un archivo. |
Ejemplos de implementación
En el siguiente ejemplo, vamos a devolver una nueva matriz de forma y tipo dados, llena de ceros. Para esto, usaremos la funciónzeros().
mx.nd.zeros((1,2), mx.cpu(), stype='csr')
Output
Esto produce la siguiente salida:
<CSRNDArray 1x2 @cpu(0)>
Example
mx.nd.zeros((1,2), mx.cpu(), 'float16', stype='row_sparse').asnumpy()
Output
Recibirá el siguiente resultado:
array([[0., 0.]], dtype=float16)
En el siguiente ejemplo, vamos a guardar una lista de matrices y un diccionario de cadenas. Para esto, usaremos la funciónsave().
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
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)>]
Example
mx.nd.load('my_dict')
Output
La salida 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)>}