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 la tf.Tensor : un conjunto de valores de forma en una matriz de una o más dimensiones. tf.Tensor s son muy similares a las matrices multidimensionales.

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

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

A tf.Tensor puede ser creado a partir de una matriz con el tf.tensor() método:

// 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 pueden crear con bool, int32, complex64 y dtypes de cadena:

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 de conveniencia para la creación de tensores azar, tensores llenas de un valor particular, tensores de HTMLImageElement s, y muchos más que se 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. Desde frecuencia, no pueden ser múltiples formas con el mismo tamaño, a menudo es útil ser capaz de cambiar la forma de un tf.Tensor a otra forma con el mismo tamaño. Esto se puede lograr con el reshape() método:

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 una tf.Tensor utilizando el Tensor.array() o Tensor.data() métodos:

 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 el álgebra lineal y el 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: la adición de elementos de dos tf.Tensor s elemento en cuanto a:

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, operaciones de retorno devuelven siempre nuevos tf.Tensor s.

Puede encontrar una lista de los soportes de operaciones TensorFlow.js aquí .

Memoria

Cuando se usa el backend WebGL, tf.Tensor memoria debe ser gestionado de forma explícita (que no es suficiente para permitir que un tf.Tensor ir fuera del alcance de su memoria para ser lanzado).

Para destruir la memoria de un tf.Tensor, se puede utilizar el dispose() método 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 una tf.tidy() Método que limpia toda tf.Tensor s que no están devuelto por una función después de ejecutar que, de forma similar a las variables locales se limpian 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() será automáticamente dispuesta. El resultado de neg() no será dispuesto, ya que es el valor de retorno de la 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 acerca de la cantidad de memoria asignada actualmente. Puede encontrar más información aquí .