TensorFlow.js to framework do definiowania i wykonywania obliczeń przy użyciu tensorów w JavaScript. Tensor to uogólnienie wektorów i macierzy do wyższych wymiarów.
Tensory
Centralną jednostką danych w TensorFlow.js jest tf.Tensor
: zestaw wartości ukształtowanych w tablicę jednego lub więcej wymiarów. tf.Tensor
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 określa 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 d float32
dtype.
tf.Tensor
s można również utworzyć za pomocą dtypes 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 udostępnia również zestaw wygodnych metod tworzenia tensorów losowych, tensorów wypełnionych określoną wartością, tensorów z HTMLImageElement
s i wielu innych, które znajdziesz tutaj .
Zmiana kształtu Tensora
Liczba elementów w tf.Tensor
jest iloczynem rozmiarów w jego kształcie. 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();
Pobieranie wartości z Tensora
Możesz również uzyskać wartości z tf.Tensor
za pomocą 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));
Udostępniamy również synchroniczne wersje tych metod, które są prostsze w użyciu, ale spowodują problemy z wydajnością w Twojej aplikacji. Zawsze należy 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 również szeroką gamę operacji odpowiednich do algebry liniowej i uczenia maszynowego, które można wykonać 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
s:
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 zwraca 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ć, aby tf.Tensor
wyszedł poza zakres, aby jego pamięć została zwolniona).
Aby zniszczyć pamięć tf.Tensor, 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 łączy się wiele operacji w jednej aplikacji. Posiadanie odwołania do wszystkich zmiennych pośrednich w celu ich usunięcia może zmniejszyć czytelność kodu. Aby rozwiązać ten problem, TensorFlow.js udostępnia tf.tidy()
, która czyści wszystkie tf.Tensor
, które nie są zwracane przez funkcję po jej wykonaniu, podobnie jak czyszczone są zmienne lokalne 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 square()
i log()
zostanie automatycznie usunięty. Wynik neg()
nie zostanie usunięty, ponieważ jest to wartość zwracana przez tf.tidy().
Możesz również uzyskać liczbę tensorów śledzonych przez TensorFlow.js:
console.log(tf.memory());
Obiekt wypisany przez tf.memory()
będzie zawierał informacje o tym, ile pamięci jest aktualnie przydzielone. Więcej informacji znajdziesz tutaj .