Tensores y operaciones

TensorFlow.js es un marco para definir y ejecutar cálculos usando tensores en JavaScript. Un tensor es una generalización de vectores y matrices a dimensiones superiores.

tensores

La unidad central de datos en TensorFlow.js es el tf.Tensor : un conjunto de valores en forma de matriz de una o más dimensiones. tf.Tensor son muy similares a las matrices multidimensionales.

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

  • rank : define cuántas dimensiones contiene el tensor
  • shape : que define el tamaño de cada dimensión de los datos
  • dtype : que define el tipo de datos del tensor.

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

// 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();

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

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

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 que puede encontrar aquí .

Cambiar la forma de un tensor

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

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

const b = a.reshape([4, 1]);
console.log('b shape:', b.shape);
b.print();

Obtener valores de un Tensor

También puede obtener los valores de un tf.Tensor usando los Tensor.array() o Tensor.data() :

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

También proporcionamos versiones síncronas de estos métodos que son más simples de usar, pero causarán problemas de rendimiento en su aplicación. Siempre debe preferir los métodos asincrónicos en las aplicaciones de producción.

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());

Operaciones

Mientras que los tensores le permiten almacenar datos, las operaciones (ops) le permiten manipular esos datos. TensorFlow.js también 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 todos los elementos en un tf.Tensor :

const x = tf.tensor([1, 2, 3, 4]);
const y = x.square();  // equivalent to tf.square(x)
y.print();

Ejemplo: agregar elementos de dos elementos tf.Tensor s:

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

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

Puede encontrar una lista de las operaciones compatibles con TensorFlow.js aquí .

Memoria

Al usar 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() :

const a = tf.tensor([[1, 2], [3, 4]]);
a.dispose(); // Equivalent to tf.dispose(a)

Es muy común encadenar varias 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:

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

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

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

console.log(tf.memory());

El objeto impreso por tf.memory() contendrá información sobre la cantidad de memoria asignada actualmente. Puede encontrar más información aquí .