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 tf.Tensor : un conjunto de valores conformados en una matriz de una o más dimensiones. tf.Tensor s 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();

De forma predeterminada, tf.Tensor s tendrá un tipo float32 dtype. tf.Tensor s también se puede crear con tipos bool, int32, complex64 y string:

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 y muchos más que puede encontrar aquí .

Cambiando la forma de un tensor

El número de elementos en un tf.Tensor es el producto de los tamaños de su forma. Dado que muchas veces puede haber varias formas con el mismo tamaño, suele ser ú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 puedes obtener los valores de un tf.Tensor usando los métodos 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 sencillas de usar, pero causarán problemas de rendimiento en su aplicación. Siempre debes preferir los métodos asincrónicos en 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 tf.Tensor s por elementos:

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

Como los tensores son inmutables, estas operaciones no cambian sus valores. En cambio, las operaciones de retorno siempre devuelven nuevos tf.Tensor s.

Puede encontrar una lista de las operaciones que admite TensorFlow.js aquí .

Memoria

Cuando se utiliza el backend de WebGL, la memoria tf.Tensor se debe administrar explícitamente ( no es suficiente dejar que un tf.Tensor salga del alcance para que se libere su memoria).

Para destruir la memoria de un tf.Tensor, puedes 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 múltiples operaciones 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 tf.Tensor s que no son devueltos por una función después de ejecutarla, de forma similar a la forma en que 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 cuánta memoria está asignada actualmente. Puedes encontrar más información aquí .