Тензоры и операции

TensorFlow.js — это платформа для определения и выполнения вычислений с использованием тензоров в JavaScript. Тензор — это обобщение векторов и матриц на более высокие измерения.

Тензоры

Центральной единицей данных в TensorFlow.js является tf.Tensor : набор значений, сформированный в массив из одного или нескольких измерений. tf.Tensor очень похожи на многомерные массивы.

tf.Tensor также содержит следующие свойства:

  • rank : определяет, сколько измерений содержит тензор
  • shape : определяет размер каждого измерения данных.
  • dtype : определяет тип данных тензора.

tf.Tensor можно создать из массива с помощью метода 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();

По умолчанию tf.Tensor будет иметь тип float32 dtype. tf.Tensor также можно создавать с типами dtype bool, int32, complex64 и 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 также предоставляет набор удобных методов для создания случайных тензоров, тензоров, заполненных определенным значением, тензоров из HTMLImageElement и многих других, которые вы можете найти здесь .

Изменение формы тензора

Количество элементов в tf.Tensor — это произведение размеров его формы. Поскольку часто может существовать несколько фигур одного и того же размера, часто полезно иметь возможность изменить форму tf.Tensor в другую фигуру того же размера. Этого можно добиться с помощью метода 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();

Получение значений из тензора

Вы также можете получить значения из tf.Tensor , используя методы Tensor.array() или 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));

Мы также предоставляем синхронные версии этих методов, которые проще в использовании, но могут вызвать проблемы с производительностью вашего приложения. В производственных приложениях всегда следует отдавать предпочтение асинхронным методам.

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());

Операции

Тензоры позволяют хранить данные, а операции (ops) позволяют манипулировать этими данными. TensorFlow.js также предоставляет широкий спектр операций, подходящих для линейной алгебры и машинного обучения, которые можно выполнять с тензорами.

Пример: вычисление x 2 всех элементов в tf.Tensor :

const x = tf.tensor([1, 2, 3, 4]);
const y = x.square();  // equivalent to tf.square(x)
y.print();

Пример: добавление элементов двух 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();

Поскольку тензоры неизменяемы, эти операции не меняют своих значений. Вместо этого ops return всегда возвращает новые tf.Tensor s.

Список операций, которые поддерживает TensorFlow.js, вы можете найти здесь .

Память

При использовании бэкэнда WebGL памятью tf.Tensor необходимо управлять явно ( недостаточно позволить tf.Tensor выйти за пределы области действия, чтобы освободить его память).

Чтобы уничтожить память tf.Tensor, вы можете использовать метод dispose() или tf.dispose() :

const a = tf.tensor([[1, 2], [3, 4]]);
a.dispose(); // Equivalent to tf.dispose(a)

Очень часто в приложении объединяют несколько операций в одну цепочку. Сохранение ссылки на все промежуточные переменные для их удаления может снизить читаемость кода. Чтобы решить эту проблему, TensorFlow.js предоставляет метод tf.tidy() , который очищает все tf.Tensor , которые не возвращаются функцией после ее выполнения, аналогично тому, как очищаются локальные переменные при выполнении функции:

const a = tf.tensor([[1, 2], [3, 4]]);
const y = tf.tidy(() => {
  const result = a.square().log().neg();
  return result;
});

В этом примере результат square() и log() будет автоматически удален. Результат neg() не будет удален, поскольку это возвращаемое значение tf.tidy().

Вы также можете получить количество тензоров, отслеживаемых TensorFlow.js:

console.log(tf.memory());

Объект, напечатанный tf.memory() будет содержать информацию о том, сколько памяти выделено в данный момент. Более подробную информацию вы можете найти здесь .