Tensori e operazioni

TensorFlow.js è un framework per definire ed eseguire calcoli utilizzando tensori in JavaScript. Un tensore è una generalizzazione di vettori e matrici a dimensioni superiori.

Tensori

L'unità centrale dei dati in TensorFlow.js è tf.Tensor : un insieme di valori modellato in una matrice di una o più dimensioni. tf.Tensor sono molto simili agli array multidimensionali.

Un tf.Tensor contiene anche le seguenti proprietà:

  • rank : definisce quante dimensioni contiene il tensore
  • shape : che definisce la dimensione di ogni dimensione dei dati
  • dtype : che definisce il tipo di dati del tensore.

Un tf.Tensor può essere creato da un array con il metodo 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();

Per impostazione predefinita, tf.Tensor s avrà un float32 dtype. tf.Tensor s può anche essere creato con bool, int32, complex64 e 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 fornisce anche una serie di metodi pratici per la creazione di tensori casuali, tensori riempiti con un valore particolare, tensori da HTMLImageElement s e molti altri che puoi trovare qui .

Modifica della forma di un tensore

Il numero di elementi in un tf.Tensor è il prodotto delle dimensioni nella sua forma. Poiché spesso possono esserci più forme con la stessa dimensione, è spesso utile poter rimodellare un tf.Tensor in un'altra forma con le stesse dimensioni. Questo può essere ottenuto con il metodo 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();

Ottenere valori da un tensore

Puoi anche ottenere i valori da un tf.Tensor usando i 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));

Forniamo anche versioni sincrone di questi metodi che sono più semplici da usare, ma causano problemi di prestazioni nell'applicazione. Dovresti sempre preferire i metodi asincroni nelle applicazioni di produzione.

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

Operazioni

Mentre i tensori ti consentono di archiviare i dati, le operazioni (ops) ti consentono di manipolare quei dati. TensorFlow.js fornisce anche un'ampia varietà di operazioni adatte per l'algebra lineare e l'apprendimento automatico che possono essere eseguite sui tensori.

Esempio: calcolo x 2 di tutti gli elementi in un tf.Tensor :

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

Esempio: aggiunta di elementi di due tf.Tensor s element-wise:

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

Poiché i tensori sono immutabili, queste operazioni non cambiano i loro valori. Invece, ops return restituisce sempre new tf.Tensor s.

È possibile trovare un elenco delle operazioni supportate da TensorFlow.js qui .

Memoria

Quando si utilizza il backend WebGL, la memoria tf.Tensor deve essere gestita in modo esplicito (non è sufficiente lasciare che un tf.Tensor esca dall'ambito per il rilascio della sua memoria).

Per distruggere la memoria di un tf.Tensor, puoi usare il metodo dispose() o tf.dispose() :

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

È molto comune concatenare più operazioni in un'applicazione. Tenere un riferimento a tutte le variabili intermedie per eliminarle può ridurre la leggibilità del codice. Per risolvere questo problema, TensorFlow.js fornisce un metodo tf.tidy() che pulisce tutti i tf.Tensor che non vengono restituiti da una funzione dopo l'esecuzione, in modo simile al modo in cui le variabili locali vengono ripulite quando viene eseguita una funzione:

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

In questo esempio, il risultato di square() e log() verrà eliminato automaticamente. Il risultato di neg() non verrà eliminato in quanto è il valore di ritorno di tf.tidy().

Puoi anche ottenere il numero di Tensor monitorati da TensorFlow.js:

console.log(tf.memory());

L'oggetto stampato da tf.memory() conterrà informazioni su quanta memoria è attualmente allocata. Puoi trovare maggiori informazioni qui .