Tensores e operações

TensorFlow.js é uma estrutura para definir e executar cálculos usando tensores em JavaScript. Um tensor é uma generalização de vetores e matrizes para dimensões superiores.

Tensores

A unidade central de dados no TensorFlow.js é o tf.Tensor : um conjunto de valores moldados em uma matriz de uma ou mais dimensões. tf.Tensor s são muito semelhantes aos arrays multidimensionais.

Um tf.Tensor também contém as seguintes propriedades:

  • rank : define quantas dimensões o tensor contém
  • shape : que define o tamanho de cada dimensão dos dados
  • dtype : que define o tipo de dados do tensor.

Um tf.Tensor pode ser criado a partir de um array com o 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 padrão, tf.Tensor s terá um tipo float32 dtype. tf.Tensor s também pode ser criado com tipos bool, int32, complex64 e 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 também fornece um conjunto de métodos convenientes para criar tensores aleatórios, tensores preenchidos com um valor específico, tensores de HTMLImageElement s e muitos mais que você pode encontrar aqui .

Alterando a forma de um tensor

O número de elementos em um tf.Tensor é o produto dos tamanhos em sua forma. Como muitas vezes pode haver várias formas com o mesmo tamanho, geralmente é útil poder remodelar um tf.Tensor para outra forma com o mesmo tamanho. Isso pode ser conseguido com o 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();

Obtendo valores de um Tensor

Você também pode obter os valores de um tf.Tensor usando os métodos Tensor.array() ou 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));

Também fornecemos versões síncronas desses métodos que são mais simples de usar, mas causarão problemas de desempenho em sua aplicação. Você deve sempre preferir os métodos assíncronos em aplicativos de produção.

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

Operações

Embora os tensores permitam armazenar dados, as operações (ops) permitem manipular esses dados. O TensorFlow.js também oferece uma ampla variedade de operações adequadas para álgebra linear e aprendizado de máquina que podem ser executadas em tensores.

Exemplo: computando x 2 de todos os elementos em um tf.Tensor :

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

Exemplo: adicionando elementos de dois tf.Tensor s elemento a elemento:

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 os tensores são imutáveis, essas operações não alteram seus valores. Em vez disso, ops return sempre retorna novos tf.Tensor s.

Você pode encontrar uma lista das operações suportadas pelo TensorFlow.js aqui .

Memória

Ao usar o backend WebGL, a memória tf.Tensor deve ser gerenciada explicitamente ( não é suficiente deixar um tf.Tensor sair do escopo para que sua memória seja liberada).

Para destruir a memória de um tf.Tensor, você pode usar o método dispose() ou tf.dispose() :

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

É muito comum encadear múltiplas operações em uma aplicação. Manter uma referência a todas as variáveis ​​intermediárias para descartá-las pode reduzir a legibilidade do código. Para resolver esse problema, TensorFlow.js fornece um método tf.tidy() que limpa todos tf.Tensor s que não são retornados por uma função após executá-la, semelhante à forma como as variáveis ​​locais são limpas quando uma função é executada:

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

Neste exemplo, o resultado de square() e log() será descartado automaticamente. O resultado de neg() não será descartado, pois é o valor de retorno de tf.tidy().

Você também pode obter o número de tensores rastreados pelo TensorFlow.js:

console.log(tf.memory());

O objeto impresso por tf.memory() conterá informações sobre quanta memória está alocada atualmente. Você pode encontrar mais informações aqui .