Este capÃtulo describe la biblioteca ndarray disponible en Apache MXNet.
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.
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. |
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. |
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)>
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.
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. |
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)>]
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.
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]… |
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)>
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.
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. |
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)>
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.
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. |
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)>}
🚫