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 è il tf.Tensor : un insieme di valori modellati in un array di una o più dimensioni. tf.Tensor s 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 ciascuna 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 dtype 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 creare tensori casuali, tensori riempiti con un valore particolare, tensori da HTMLImageElement e molti altri che puoi trovare qui .

Cambiare la 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 la stessa dimensione. Ciò 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 utilizzando i metodi 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 utilizzare, ma causeranno 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 consentono di archiviare dati, le operazioni (ops) consentono di manipolare tali dati. TensorFlow.js fornisce inoltre un'ampia varietà di operazioni adatte all'algebra lineare e all'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 in termini di elementi:

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 nuovi tf.Tensor s.

Puoi 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 affinché la sua memoria venga rilasciata).

Per distruggere la memoria di un tf.Tensor, puoi utilizzare 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 insieme in un'applicazione. Mantenere 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 ripulisce tutti i tf.Tensor che non vengono restituiti da una funzione dopo averla eseguita, 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 poiché è il valore restituito da tf.tidy().

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

console.log(tf.memory());

L'oggetto stampato da tf.memory() conterrà informazioni sulla quantità di memoria attualmente allocata. Puoi trovare maggiori informazioni qui .