Tensores y Operaciones

En este artículo, vamos a discutir los tensores y su funcionamiento.

Introducción: TensorFlow.js es una biblioteca para definir y ejecutar cálculos usando tensores en JavaScript. Un tensor es una generalización de vectores y arrays a dimensiones superiores. 

Tensores: la unidad central de datos en TensorFlow.js es el tf.Tensor , un conjunto de valores en forma de array de una o más dimensiones. tf.Tensor son muy similares a las arrays multidimensionales.

Un tf.Tensor también contiene las siguientes propiedades:

  • rango: Define cuántas dimensiones contiene el tensor.
  • forma: Que define el tamaño de cada dimensión de los datos.
  • dtype: Que define el tipo de datos del tensor.

Nota: Usaremos el término «dimensión» indistintamente con el rango. A veces, en el aprendizaje automático, 
«dimensionalmente» de un tensor también se puede denominar el tamaño de una dimensión particular (por ejemplo, una array de forma [10, 5] es un tensor de rango 2 o un tensor bidimensional. La dimensionalidad de la primera dimensión es 10. Esto puede resultar confuso, pero ponemos esta nota aquí porque es probable que se encuentre con estos usos duales del término).

Se puede crear un tf.Tensor a partir de una array con el método tf.Tensor() .

JavaScript

// Create a rank-2 tensor (matrix) matrix
// tensor from a multidimensional array
const a = tf.tensor([[1,2], [3,4]]);
console.log('shape:', a.shape);
a.print();
  
// Or you can create a tensor from a
// flat array and specify a shape.
const shape = [2, 2];
const b = tf.tensor([1,2,3,4], shape);
console.log('shape:', b.shape);
b.print();

Producción:

 
shape: 2,2
Tensor
    [[1, 2],
     [3, 4]]
shape: 2,2
Tensor
    [[1, 2],
     [3, 4]]

Por defecto, tf.Tensor tendrá un dtype float32 . tf.Tensor también se puede crear con bool, int32, complex64 y usando dtypes:

JavaScript

const a = tf.tensor([[1,2], [3,4]], [2,2], 'int32');
console.log('shape:', a.shape);
console.log('dtype', a.dtype);
a.print();

Producción: 

shape: 2, 2
dtype int32
Tensor
    [[1, 2],
     [3, 4]]

TensorFlow.js también proporciona un conjunto de métodos convenientes para crear tensores aleatorios, tensores rellenos con un valor particular, tensores de HTMLImageElement s y muchos más.

Cambiando la forma de un Tensor: El número de elementos en un tf.Tensor es el producto del tamaño en su forma. Dado que a menudo puede haber múltiples formas del mismo tamaño, a menudo es útil poder remodelar un tf.Tensor a otra forma del mismo tamaño. Esto se puede lograr con el método remodelar() .

JavaScript

const a = tf.tensor([[1,2], [3,4]]);
console.log('a shape:', a.shape);
a.print();
const b = a.redshape([4,1]);
console.log('b shape:', b.shape);
b.print();

Producción:

a=array([1, 2, 3, 4])

Obtener valores de un tensor: también puede obtener los valores de un tf.Tensor utilizando los métodos Tensor.array()Tensor.data()  :

JavaScript

const a = tf.tensor([[1,2], [3,4]]);
 
// Returns the multi-dimensional array of values
a.array().then(array => console.log(array));
 
// Returns the flattened data that backs the tensor
a.data().then(data => console.log(data));

Producción: 
 

Tensor 
    [1, 2, 3, 4]

También proporcionamos versiones sincrónicas de este método que son más simples de usar pero causarán problemas de rendimiento en su aplicación. Siempre debe preferir los métodos sincrónicos en las aplicaciones de producción. 

JavaScript

const a = tf.tensor([[1,2],[3,4]]);
 
// Returns the multi dimensional array of values
console.log(a.arraySync());
 
// Returns the flattened data that backs the tensor
console.log(a.dataSync());

 
Producción: 

a = [1, 2, 3, 4]

Operaciones: mientras que los tensores le permiten almacenar datos, las operaciones (ops) le permiten manipular esos datos. TensorFlow.js proporciona una amplia variedad de operaciones adecuadas para álgebra lineal y aprendizaje automático que se pueden realizar en tensores.

Ejemplo: Calcular x^2 de al elemento en un tf.Tensor: 

JavaScript

const x = tf.tensor([1,2,3,4]);
 
// Equivalent to tf.square(x)
const y = x.square();  
y.print();
Output for the above code:
y=x([1, 4, 9, 16 ] )

Ejemplo: Agregar elementos de dos elementos tf.Tensor

JavaScript

const a = tf.tensor([1,2,3,4]);
const b = tf.tensor([10,20,30,40]);
 
// Equivalent to tf.add(a,b)
const y = a.add(b);
y.print();

 Producción: 

numpy = array([ 11, 22, 33, 44 ])

Debido a que los tensores son inmutables, estas operaciones no cambian sus valores. En cambio, ops return siempre devuelve nuevos tf.Tensor s.

Memoria: cuando se usa el backend WebGL, la memoria tf.Tensor debe administrarse explícitamente (no es suficiente dejar que un tf.tensor quede fuera del alcance para que se libere su memoria).

Para destruir la memoria de un tf.Tensor, puede usar el método dispose() o tf.dispose() :

Es muy común enstringr operaciones juntas en una aplicación. Mantener una referencia a todas las variables intermedias para eliminarlas puede reducir la legibilidad del código. Para resolver este problema, TensorFlow.js proporciona un método tf.tidy() que limpia todos los tf.Tensor que no devuelve una función después de ejecutarla, de forma similar a como se limpian las variables locales cuando se ejecuta una función: 

JavaScript

const a = tf.tensor([[1,2],[3,4]]);
const y = tf.tidy(() => {
const result = a.square().log().neg();
return result;
});

Producción: 

En este ejemplo, el resultado de square() y log() se eliminará automáticamente. El resultado de neg() no se divulgará, ya que es el valor de retorno de tf.tidy().

También puede obtener la cantidad de tensores rastreados por TensorFlow.js: 

JavaScript

console.log(tf.memory());

Producción: 

It will display a message on the console while debugging.
e.g 
console.log("Hello World");
Now if we run this using --   node helloworld.js
It will print---   Hello World

El objeto impreso por tf.memory()  contendrá información sobre la cantidad de memoria asignada actualmente.

Publicación traducida automáticamente

Artículo escrito por akashpandit1103 y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *