Apache MXNet: símbolo de la API de Python
En este capítulo, aprenderemos sobre una interfaz en MXNet que se denomina Símbolo.
Mxnet.ndarray
Symbol API de Apache MXNet es una interfaz para programación simbólica. Symbol API presenta el uso de lo siguiente:
Gráficos computacionales
Uso de memoria reducido
Optimización de funciones previas al uso
El ejemplo que se muestra a continuación muestra cómo se puede crear una expresión simple utilizando la API de símbolos de MXNet:
Un NDArray utilizando una 'matriz' 1-D y 2-D de una lista regular de Python -
import mxnet as mx
# Two placeholders namely x and y will be created with mx.sym.variable
x = mx.sym.Variable('x')
y = mx.sym.Variable('y')
# The symbol here is constructed using the plus ‘+’ operator.
z = x + y
Output
Verá la siguiente salida:
<Symbol _plus0>
Example
(x, y, z)
Output
La salida se da a continuación:
(<Symbol x>, <Symbol y>, <Symbol _plus0>)
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 Symbol API de MXNet:
Clase | Definición |
---|---|
Símbolo (asa) | Esta clase llamada símbolo es el gráfico simbólico de Apache MXNet. |
Funciones y sus parámetros
A continuación se muestran algunas de las funciones importantes y sus parámetros cubiertos por mxnet.Symbol API -
Función y sus parámetros | Definición |
---|---|
Activación ([data, act_type, out, name]) | Aplica una función de activación por elementos a la entrada. Apoyarelu, sigmoid, tanh, softrelu, softsign funciones de activación. |
BatchNorm ([datos, 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 escalagamma y compensar 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. |
Esta función convertirá todos los elementos de la entrada a un nuevo tipo. | Esta función, como nombre especificado, devuelve un nuevo símbolo de forma y tipo determinados, lleno de ceros. |
unos (forma [, dtype]) | Esta función, como nombre especificado, devuelve un nuevo símbolo de forma y tipo determinados, lleno de unos. |
completo (forma, val [, dtype]) | Esta función, como nombre especificado, devuelve una nueva matriz de forma y tipo dados, rellena con el valor dado val. |
arange (iniciar [, detener, paso, repetir,…]) | Devolverá valores espaciados uniformemente dentro de un intervalo dado. Los valores se generan dentro del intervalo semiabierto [inicio, parada), lo que significa que el intervalo incluyestart pero excluye stop. |
linspace (inicio, parada, num [, punto final, nombre,…]) | Devolverá números espaciados uniformemente dentro de un intervalo especificado. De manera similar a la función organizar (), los valores se generan dentro del intervalo medio abierto [inicio, parada), lo que significa que el intervalo incluyestart pero excluye stop. |
histograma (a [, bins, rango]) | Como su nombre lo indica, esta función calculará el histograma de los datos de entrada. |
poder (base, exp) | Como su nombre lo indica, esta función devolverá el resultado de elementos de base elemento elevado a poderes de expelemento. Ambas entradas, es decir, base y exp, pueden ser símbolo o escalar. Aquí tenga en cuenta que no se permite la transmisión. Puedes usarbroadcast_pow si desea utilizar la función de transmisión. |
SoftmaxActivation ([datos, modo, nombre, atributo, salida]) | Esta función aplica la activación softmax a la entrada. Está destinado a capas internas. En realidad, está obsoleto, podemos usarsoftmax() en lugar. |
Ejemplos de implementación
En el siguiente ejemplo usaremos la función power() que devolverá el resultado del elemento base elevado a los poderes del elemento exp:
import mxnet as mx
mx.sym.power(3, 5)
Output
Verá la siguiente salida:
243
Example
x = mx.sym.Variable('x')
y = mx.sym.Variable('y')
z = mx.sym.power(x, 3)
z.eval(x=mx.nd.array([1,2]))[0].asnumpy()
Output
Esto produce la siguiente salida:
array([1., 8.], dtype=float32)
Example
z = mx.sym.power(4, y)
z.eval(y=mx.nd.array([2,3]))[0].asnumpy()
Output
Cuando ejecute el código anterior, debería ver el siguiente resultado:
array([16., 64.], dtype=float32)
Example
z = mx.sym.power(x, y)
z.eval(x=mx.nd.array([4,5]), y=mx.nd.array([2,3]))[0].asnumpy()
Output
La salida se menciona a continuación:
array([ 16., 125.], dtype=float32)
En el ejemplo que se muestra a continuación, usaremos la función SoftmaxActivation() (or softmax()) que se aplicará a la entrada y está destinado a capas internas.
input_data = mx.nd.array([[2., 0.9, -0.5, 4., 8.], [4., -.7, 9., 2., 0.9]])
soft_max_act = mx.nd.softmax(input_data)
print (soft_max_act.asnumpy())
Output
Verá la siguiente salida:
[[2.4258138e-03 8.0748333e-04 1.9912292e-04 1.7924475e-02 9.7864312e-01]
[6.6843745e-03 6.0796250e-05 9.9204916e-01 9.0463174e-04 3.0112563e-04]]
symbol.contrib
La API Contrib NDArray se define en el paquete symbol.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.symbol.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 ciclo con cálculo definido por el usuario sobre NDArrays en la dimensión 0. Esta función simula un ciclo for y el cuerpo tiene el cálculo para una iteración del ciclo 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. |
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 recantiza 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 de calibración. |
index_copy ([antiguo_tensor, index_vector,…]) | Esta función copia los elementos de un new_tensor into the old_tensor by selecting the indices in the order given in index. The output of this operator will be a new tensor that contains the rest elements of old tensor and the copied elements of new tensor. |
interleaved_matmul_encdec_qk ([consultas,…]) | Este operador calcula la multiplicación de matrices entre las proyecciones de consultas y claves en el uso de atención multicabezal como codificador-decodificador. La condición es que las entradas deben ser un tensor de proyecciones de consultas que siga el diseño: (seq_length, batch_size, num_heads *, head_dim). |
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
true_cls = mx.sym.Variable('true_cls')
samples, exp_count_true, exp_count_sample = mx.sym.contrib.rand_zipfian(true_cls, 5, 6)
samples.eval(true_cls=mx.nd.array([3]))[0].asnumpy()
Output
Verá la siguiente salida:
array([4, 0, 2, 1, 5], dtype=int64)
Example
exp_count_true.eval(true_cls=mx.nd.array([3]))[0].asnumpy()
Output
La salida se menciona a continuación:
array([0.57336551])
Example
exp_count_sample.eval(true_cls=mx.nd.array([3]))[0].asnumpy()
Output
Verá la siguiente salida:
array([1.78103594, 0.46847373, 1.04183923, 0.57336551, 1.04183923])
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_vars = (mx.sym.var('i'), mx.sym.var('s'))
outputs, states = mx.sym.contrib.while_loop(cond, func, loop_vars, max_iterations=10)
print(outputs)
Output
La salida se da a continuación:
[<Symbol _while_loop0>]
Example
Print(States)
Output
Esto produce la siguiente salida:
[<Symbol _while_loop0>, <Symbol _while_loop0>]
En el siguiente ejemplo usaremos la función index_copy que copia los elementos de new_tensor en old_tensor.
import mxnet as mx
a = mx.nd.zeros((6,3))
b = mx.nd.array([[1,2,3],[4,5,6],[7,8,9]])
index = mx.nd.array([0,4,2])
mx.nd.contrib.index_copy(a, index, b)
Output
Cuando ejecute el código anterior, debería ver el siguiente resultado:
[[1. 2. 3.]
[0. 0. 0.]
[7. 8. 9.]
[0. 0. 0.]
[4. 5. 6.]
[0. 0. 0.]]
<NDArray 6x3 @cpu(0)>
simbolo imagen
La API de símbolo de imagen se define en el paquete symbol.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 presentan algunas de las funciones importantes y sus parámetros cubiertos por mxnet.symbol.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. |
recortar ([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. |
normalizar ([datos, media, estándar, salida, nombre]) | 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. Aumentará la muestra del resultado sisrc es más pequeño que el size. |
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 ([datos, rango x, rango y,…]) | 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 ració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, salida, 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.sym.random.uniform(0, 255, (4, 2, 3)).astype(dtype=np.uint8)
mx.sym.image.to_tensor(img)
Output
La salida se indica a continuación:
<Symbol to_tensor4>
Example
img = mx.sym.random.uniform(0, 255, (2, 4, 2, 3)).astype(dtype=np.uint8)
mx.sym.image.to_tensor(img)
Output
La salida se menciona a continuación:
<Symbol to_tensor5>
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.sym.random.uniform(0, 1, (3, 4, 2))
mx.sym.image.normalize(img, mean=(0, 1, 2), std=(3, 2, 1))
Output
A continuación se muestra la salida del código:
<Symbol normalize0>
Example
img = mx.sym.random.uniform(0, 1, (2, 3, 4, 2))
mx.sym.image.normalize(img, mean=(0, 1, 2), std=(3, 2, 1))
Output
La salida se muestra a continuación:
<Symbol normalize1>
símbolo aleatorio
La API de símbolo aleatorio se define en el paquete symbol.random. Como su nombre lo indica, es el generador de distribución aleatoria Symbol 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.symbol.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). |
poisson ([lam, shape, dtype, ctx, out]) | Genera muestras aleatorias a partir de una distribución de Poisson. |
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) de acuerdo con 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 mezclar los elementos aleatoriamente usando la función shuffle (). Mezclará la matriz a lo largo del primer eje.
data = mx.nd.array([[0, 1, 2], [3, 4, 5], [6, 7, 8],[9,10,11]])
x = mx.sym.Variable('x')
y = mx.sym.random.shuffle(x)
y.eval(x=data)
Output
Verá el siguiente resultado:
[
[[ 9. 10. 11.]
[ 0. 1. 2.]
[ 6. 7. 8.]
[ 3. 4. 5.]]
<NDArray 4x3 @cpu(0)>]
Example
y.eval(x=data)
Output
Cuando ejecute el código anterior, debería ver el siguiente resultado:
[
[[ 6. 7. 8.]
[ 0. 1. 2.]
[ 3. 4. 5.]
[ 9. 10. 11.]]
<NDArray 4x3 @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.sym.random.generalized_negative_binomial(10, 0.1)
Output
La salida se da a continuación:
<Symbol _random_generalized_negative_binomial0>
símbolo escaso
La API de símbolo disperso se define en el paquete mxnet.symbol.sparse. Como su nombre lo indica, proporciona gráficos de redes neuronales dispersas y diferenciación automática en la CPU.
Funciones y sus parámetros
A continuación se presentan algunas de las funciones importantes (incluye rutinas de creación de símbolos, rutinas de manipulación de símbolos, funciones matemáticas, función trigonométrica, funciones hiberbólicas, funciones de reducción, redondeo, potencias, red neuronal) y sus parámetros cubiertos por mxnet.symbol.sparse API -
Función y sus parámetros | Definición |
---|---|
ElementWiseSum (* argumentos, ** kwargs) | Esta función agregará todos los elementos de argumentos de entrada. Por ejemplo, _ (1,2,… = 1 + 2 + ⋯ +). Aquí, podemos ver que add_n es potencialmente más eficiente que llamar a add n veces. |
Incorporación ([datos, peso, input_dim,…]) | Mapeará los índices enteros a representaciones vectoriales, es decir, incrustaciones. En realidad, asigna palabras a vectores de valor real en un espacio de alta dimensión, lo que se denomina incrustaciones de palabras. |
LinearRegressionOutput ([datos, etiqueta,…]) | Calcula y optimiza la pérdida al cuadrado durante la propagación hacia atrás, proporcionando solo datos de salida durante la propagación hacia adelante. |
LogisticRegressionOutput ([datos, etiqueta,…]) | Aplica una función logística que también se llama función sigmoidea a la entrada. La función se calcula como 1/1 + exp (−x). |
MAERegressionOutput ([datos, etiqueta,…]) | Este operador calcula el error absoluto medio de la entrada. MAE es en realidad una métrica de riesgo que corresponde al valor esperado del error absoluto. |
abs ([data, name, attr, out]) | Como su nombre lo indica, esta función devolverá el valor absoluto de la entrada por elementos. |
adagrad_update ([peso, graduación, historia, lr,…]) | Es una función de actualización para AdaGrad optimizer. |
adam_update ([peso, grad, media, var, lr,…]) | Es una función de actualización para Adam optimizer. |
add_n (* argumentos, ** kwargs) | Como su nombre lo indica, agregará todos los argumentos de entrada por elementos. |
arccos ([datos, nombre, atributo, fuera]) | Esta función devolverá el coseno inverso de elementos de la matriz de entrada. |
punto ([lhs, rhs, transpose_a, transpose_b,…]) | Como su nombre lo indica, dará el producto escalar de dos matrices. Dependerá de la dimensión de la matriz de entrada: 1-D: producto interno de los vectores 2-D: multiplicación de matrices ND: un producto de suma sobre el último eje de la primera entrada y el primer eje de la segunda entrada. |
elemwise_add ([lhs, rhs, name, attr, out]) | Como su nombre lo indica, lo hará add elementos de argumentos sabios. |
elemwise_div ([lhs, rhs, name, attr, out]) | Como su nombre lo indica, lo hará divide elementos de argumentos sabios. |
elemwise_mul ([lhs, rhs, name, attr, out]) | Como su nombre lo indica, lo hará Multiply elementos de argumentos sabios. |
elemwise_sub ([lhs, rhs, name, attr, out]) | Como su nombre lo indica, restará elementos de argumentos. |
exp ([data, name, attr, out]) | Esta función devolverá el valor exponencial por elemento de la entrada dada. |
sgd_update ([peso, graduación, lr, wd,…]) | Actúa como una función de actualización para el optimizador de descenso de gradiente estocástico. |
sigmoide ([data, name, attr, out]) | Como su nombre lo indica, computará sigmoid de x elemento sabio. |
sign ([data, name, attr, out]) | Devolverá el signo sabio del elemento de la entrada dada. |
sin ([data, name, attr, out]) | Como su nombre lo indica, esta función calculará el seno sabio del elemento de la matriz de entrada dada. |
Ejemplo de implementación
En el siguiente ejemplo, vamos a mezclar los elementos aleatoriamente usando ElementWiseSum()función. Mapeará índices enteros a representaciones vectoriales, es decir, incrustaciones de palabras.
input_dim = 4
output_dim = 5
Example
/* Here every row in weight matrix y represents a word. So, y = (w0,w1,w2,w3)
y = [[ 0., 1., 2., 3., 4.],
[ 5., 6., 7., 8., 9.],
[ 10., 11., 12., 13., 14.],
[ 15., 16., 17., 18., 19.]]
/* Here input array x represents n-grams(2-gram). So, x = [(w1,w3), (w0,w2)]
x = [[ 1., 3.],
[ 0., 2.]]
/* Now, Mapped input x to its vector representation y.
Embedding(x, y, 4, 5) = [[[ 5., 6., 7., 8., 9.],
[ 15., 16., 17., 18., 19.]],
[[ 0., 1., 2., 3., 4.],
[ 10., 11., 12., 13., 14.]]]