Матрицы, векторы и операции над ними

В TensorFlow.js центральной структурой данных является тензор — многомерный массив чисел. Тензоры классифицируются по рангу:

  • Скаляр (ранг 0) — одно число.
  • Вектор (ранг 1) — одномерный массив.
  • Матрица (ранг 2) — двумерный массив.
  • Тензор ранга 3 и выше — многомерные массивы, например, изображение в формате [высота, ширина, каналы].

Создание тензоров осуществляется с помощью функций tf.tensor(), tf.tensor1d(), tf.tensor2d() и аналогичных. Примеры:

const scalar = tf.scalar(5);
const vector = tf.tensor1d([1, 2, 3]);
const matrix = tf.tensor2d([[1, 2], [3, 4]]);

Каждый тензор имеет форму (shape) и тип данных (dtype), которые можно получить через свойства shape и dtype.

console.log(matrix.shape); // [2, 2]
console.log(matrix.dtype); // 'float32'

Основные операции с тензорами

TensorFlow.js предоставляет широкий набор операций, позволяющих манипулировать данными и выполнять вычисления:

Арифметические операции

  • Сложение, вычитание, умножение, деление выполняются функциями tf.add(), tf.sub(), tf.mul(), tf.div() или оператором tensor.add(), tensor.mul() для метода объекта.
  • Пример:
const a = tf.tensor1d([1, 2, 3]);
const b = tf.tensor1d([4, 5, 6]);
const c = tf.add(a, b); // [5, 7, 9]
  • Матричное умножение осуществляется функцией tf.matMul(a, b) для тензоров ранга 2.
const x = tf.tensor2d([[1, 2], [3, 4]]);
const y = tf.tensor2d([[5, 6], [7, 8]]);
const z = tf.matMul(x, y); 
// [[19, 22], [43, 50]]

Трансформация тензоров

  • Ресайзинг: reshape() изменяет форму тензора без изменения данных.
const t = tf.tensor1d([1, 2, 3, 4]);
const reshaped = t.reshape([2, 2]); // [[1, 2], [3, 4]]
  • Транспонирование: tf.transpose() меняет местами оси матрицы.
const m = tf.tensor2d([[1, 2, 3], [4, 5, 6]]);
const transposed = tf.transpose(m); // [[1, 4], [2, 5], [3, 6]]
  • Извлечение и объединение: tf.concat() объединяет тензоры по заданной оси, tf.slice() извлекает подтензор.
const t1 = tf.tensor2d([[1, 2]]);
const t2 = tf.tensor2d([[3, 4]]);
const combined = tf.concat([t1, t2], 0); // [[1, 2], [3, 4]]

Линейная алгебра

TensorFlow.js включает методы для работы с линейной алгеброй:

  • Норма вектора: tf.norm(vector, ord) вычисляет L1, L2 или любую другую норму.
  • Обратная матрица: tf.linalg.inv(matrix) возвращает обратную матрицу для квадратной матрицы.
  • Детерминант: tf.linalg.det(matrix) вычисляет детерминант.
  • Собственные значения и векторы: tf.linalg.eig(matrix) для анализа спектра матриц.
const m = tf.tensor2d([[2, 1], [1, 2]]);
const inv = tf.linalg.inv(m);

Элементарные операции и функции активации

TensorFlow.js поддерживает побитовые, логические и тригонометрические операции, которые применяются к каждому элементу тензора:

  • tf.sin(tensor), tf.cos(tensor), tf.exp(tensor), tf.log(tensor)
  • Пример:
const t = tf.tensor1d([0, Math.PI / 2, Math.PI]);
const sines = tf.sin(t); // [0, 1, 0]
  • Функции активации нейронных сетей: tf.relu(), tf.sigmoid(), tf.tanh() применяются к тензорам для нелинейной трансформации.

Бродкастинг

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

  • Например, прибавление вектора к каждой строке матрицы:
const mat = tf.tensor2d([[1, 2], [3, 4]]);
const vec = tf.tensor1d([10, 20]);
const result = mat.add(vec); // [[11, 22], [13, 24]]
  • Бродкастинг расширяет меньший тензор автоматически по нужным осям без явного копирования данных.

Работа с памятью

TensorFlow.js использует управление памятью вручную через tf.tidy() для автоматического удаления промежуточных тензоров и предотвращения утечек памяти:

tf.tidy(() => {
  const a = tf.tensor1d([1, 2, 3]);
  const b = tf.tensor1d([4, 5, 6]);
  const c = a.add(b);
  c.print();
});
// a, b, c автоматически очищаются после выхода из tidy
  • Для явного освобождения используется tensor.dispose(), особенно при работе с большими матрицами и изображениями.

Итоги по работе с матрицами и векторами

  • Тензор — центральная структура данных.
  • Основные операции включают арифметику, матричное умножение, трансформации и линейную алгебру.
  • Бродкастинг позволяет работать с тензорами разных форм без лишнего копирования.
  • Эффективное управление памятью предотвращает утечки и повышает производительность.

Эти концепции образуют фундамент для построения нейронных сетей, анализа данных и создания вычислительных графов в TensorFlow.js.