TensorFlow.js to framework do definiowania i przeprowadzania obliczeń przy użyciu tensorów w JavaScript. Tensor to uogólnienie wektorów i macierzy na wyższe wymiary.
Tensory
Centralną jednostką danych w TensorFlow.js jest tf.Tensor
: zbiór wartości uformowany w tablicę o jednym lub większej liczbie wymiarów. tf.Tensor
s są bardzo podobne do tablic wielowymiarowych.
tf.Tensor
zawiera również następujące właściwości:
-
rank
: określa, ile wymiarów zawiera tensor -
shape
: który definiuje rozmiar każdego wymiaru danych -
dtype
: który definiuje typ danych tensora.
tf.Tensor
można utworzyć z tablicy za pomocą metody 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();
Domyślnie tf.Tensor
s będzie miał typ float32
dtype.
tf.Tensor
s można również utworzyć za pomocą typów bool, int32, complex64 i 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 zapewnia także zestaw wygodnych metod tworzenia losowych tensorów, tensorów wypełnionych określoną wartością, tensorów z HTMLImageElement
s i wielu innych, które można znaleźć tutaj .
Zmiana kształtu tensora
Liczba elementów w tf.Tensor
jest iloczynem rozmiarów jego kształtu. Ponieważ często może istnieć wiele kształtów o tym samym rozmiarze, często przydatna jest możliwość zmiany kształtu tf.Tensor
na inny kształt o tym samym rozmiarze. Można to osiągnąć za pomocą metody 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();
Uzyskiwanie wartości z tensora
Możesz także uzyskać wartości z tf.Tensor
za pomocą metod Tensor.array()
lub 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));
Oferujemy również synchroniczne wersje tych metod, które są prostsze w użyciu, ale powodują problemy z wydajnością aplikacji. Zawsze powinieneś preferować metody asynchroniczne w aplikacjach produkcyjnych.
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());
Operacje
Podczas gdy tensory umożliwiają przechowywanie danych, operacje (ops) umożliwiają manipulowanie tymi danymi. TensorFlow.js zapewnia także szeroką gamę operacji odpowiednich dla algebry liniowej i uczenia maszynowego, które można wykonywać na tensorach.
Przykład: obliczenie x 2 wszystkich elementów w tf.Tensor
:
const x = tf.tensor([1, 2, 3, 4]);
const y = x.square(); // equivalent to tf.square(x)
y.print();
Przykład: dodanie elementów dwóch elementów tf.Tensor
:
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();
Ponieważ tensory są niezmienne, te operacje nie zmieniają swoich wartości. Zamiast tego ops return zawsze zwracają nowe tf.Tensor
s.
Listę operacji obsługiwanych przez TensorFlow.js znajdziesz tutaj .
Pamięć
Podczas korzystania z backendu WebGL pamięć tf.Tensor
musi być zarządzana jawnie ( nie wystarczy pozwolić tf.Tensor
wyjść poza zakres, aby jego pamięć została zwolniona).
Aby zniszczyć pamięć tf.Tensora, możesz użyć metody dispose()
lub tf.dispose()
:
const a = tf.tensor([[1, 2], [3, 4]]);
a.dispose(); // Equivalent to tf.dispose(a)
Bardzo często zdarza się, że w aplikacji łączy się wiele operacji. Trzymanie odniesienia do wszystkich zmiennych pośrednich w celu ich usunięcia może zmniejszyć czytelność kodu. Aby rozwiązać ten problem, TensorFlow.js udostępnia metodę tf.tidy()
, która czyści wszystkie tf.Tensor
, które nie są zwracane przez funkcję po jej wykonaniu, podobnie jak zmienne lokalne są czyszczone podczas wykonywania funkcji:
const a = tf.tensor([[1, 2], [3, 4]]);
const y = tf.tidy(() => {
const result = a.square().log().neg();
return result;
});
W tym przykładzie wynik funkcji square()
i log()
zostanie automatycznie usunięty. Wynik neg()
nie zostanie usunięty, ponieważ jest to wartość zwracana przez funkcję tf.tidy().
Możesz także uzyskać liczbę tensorów śledzonych przez TensorFlow.js:
console.log(tf.memory());
Obiekt wypisany przez tf.memory()
będzie zawierał informację o ilości aktualnie przydzielonej pamięci. Więcej informacji znajdziesz tutaj .