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 .