Dziękujemy za zapoznanie się z Google I/O. Zobacz wszystkie sesje na żądanie Oglądaj na żądanie

Tensory i operacje

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 .