Tensory i operacje

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 do sposobu, w jaki 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 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 zaalokowanej pamięci. Więcej informacji znajdziesz tutaj .