TensorFlow.js использует концепцию графа вычислений для организации операций с данными. Граф вычислений — это ориентированный ациклический граф, где узлы представляют собой операции (например, матричное умножение, активацию, свёртку), а рёбра — потоки тензоров между этими операциями. Такой подход позволяет эффективно управлять вычислениями, оптимизировать их выполнение и использовать возможности ускорителей (GPU или WebGL).
В TensorFlow.js ключевой структурой данных является
тензор (tf.Tensor). Тензор — это
многомерный массив с определённым типом данных (float32,
int32, bool и др.) и формой
(shape), определяющей количество измерений и их размеры.
Тензоры могут быть:
[32, 32, 3].Создание тензоров осуществляется через функции
tf.tensor, tf.tensor1d,
tf.tensor2d и т.д. Тензоры в TensorFlow.js являются
неизменяемыми объектами: все операции возвращают новый тензор, не
изменяя исходный.
В отличие от обычного выполнения операций, где каждое вычисление происходит немедленно, граф вычислений в TensorFlow.js позволяет описать последовательность операций, которые затем можно выполнить с конкретными данными. Граф строится динамически, что облегчает отладку и эксперименты.
Пример построения графа:
const x = tf.tensor1d([1, 2, 3]);
const y = tf.tensor1d([4, 5, 6]);
const z = x.add(y); // Создаётся узел в графе, результат — новый тензор
Здесь x.add(y) не просто суммирует элементы, а создаёт
операцию в графе, результат которой можно использовать для дальнейших
вычислений.
Одной из ключевых возможностей TensorFlow.js является автоматическое вычисление градиентов, реализованное через ленту градиентов (Gradient Tape). Лента градиентов отслеживает все операции над тензорами, для которых требуется вычисление производных, и позволяет получать градиенты функции по входным параметрам.
const x = tf.variable(tf.scalar(3.0));
tf.tidy(() => {
const optimizer = tf.train.sgd(0.1);
tf.variableGrads(() => {
return tf.square(x).add(tf.scalar(2).mul(x));
});
});
tf.variable создаёт изменяемую переменную, с которой
можно работать в процессе обучения.tf.tidy управляет памятью, автоматически удаляя
промежуточные тензоры.tf.variableGrads или tf.grad позволяют
вычислять градиенты по заданным переменным. Лента градиентов записывает
операции в порядке их выполнения и применяет обратное
распространение ошибки, вычисляя производные.Лента градиентов ведёт запись всех операций над тензорами в
обратном порядке, создавая цепочку зависимости. Для
функции y = f(x) градиенты вычисляются с конца графа к
началу:
tape.gradient(y, x), который идёт по графу обратно и
вычисляет производные функции y по x.Такой подход позволяет автоматически дифференцировать сложные композиции функций, включая нелинейные активации, свёртки и операции над батчами данных.
В JavaScript управление памятью особенно важно, поскольку браузер может быстро исчерпать ресурсы. TensorFlow.js предоставляет:
Пример:
tf.tidy(() => {
const a = tf.tensor([1, 2, 3]);
const b = a.square();
return b;
}); // a автоматически удаляется, возвращается только b
Граф вычислений и лента градиентов становятся основой для реализации
обучения моделей. Класс tf.Model и
высокоуровневые API (tf.sequential, tf.layers)
используют эти механизмы:
tf.train.sgd, tf.train.adam)
обновляют веса на основе градиентов.Такой подход обеспечивает модульность: граф вычислений можно использовать повторно, а лента градиентов — автоматически поддерживать корректное обновление параметров.
tf.variable для всех
параметров, которые будут обучаться.tf.tidy для
контроля памяти.Граф вычислений и лента градиентов обеспечивают TensorFlow.js мощным инструментарием для высокопроизводительных численных вычислений и обучения моделей прямо в браузере, сохраняя при этом контроль над памятью и вычислительными потоками.