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 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 .