TensorFlow.js реализует ленивые вычисления, что означает, что большинство операций с тензорами и графами выполняются только при необходимости, а не сразу после их объявления. Такой подход позволяет:
В отличие от обычного JavaScript, где функции выполняются сразу после
вызова, TensorFlow.js строит граф вычислений, который
затем можно запустить с помощью метода tensor.data(),
tensor.array() или model.predict().
Пример создания тензоров и ленивого выполнения:
import * as tf from '@tensorflow/tfjs';
const a = tf.tensor([1, 2, 3, 4]);
const b = tf.tensor([5, 6, 7, 8]);
const c = a.add(b); // Операция только записана, вычисления ещё нет
console.log(c.dataSync()); // Только здесь происходит фактическое вычисление
Здесь add не выполняет сложение немедленно. Вызов
dataSync() инициирует вычисление и возвращает значения.
TensorFlow.js поддерживает потоковую обработку
(streaming) через API tf.data, которое позволяет
работать с большими массивами данных без их полного загрузки в память.
Потоковая обработка особенно актуальна при обучении моделей на
изображениях, аудио или текстах.
Основные возможности:
Пример создания потока из массива и пакетирования:
const dataset = tf.data.array([1, 2, 3, 4, 5, 6, 7, 8])
.batch(2)
.map(x => x.mul(2)); // Преобразование элементов
await dataset.forEachAsync(batch => {
batch.print(); // Вывод батчей по мере их обработки
});
В этом примере элементы обрабатываются постепенно, без необходимости создавать новый массив с удвоенными значениями.
TensorFlow.js применяет автоматическое управление памятью, используя концепцию tidy.
tf.tidy() создает локальный контекст для тензоров.Пример:
const result = tf.tidy(() => {
const x = tf.tensor([1, 2, 3]);
const y = x.square();
return y; // только y будет сохранён, x удалится
});
Без tf.tidy() большие цепочки операций могут привести к
утечке памяти, особенно при итеративной обработке потоков данных.
Модели TensorFlow.js также используют ленивые вычисления. При вызове
model.predict() вычисляется только конечный
результат, а промежуточные операции автоматически
оптимизируются.
Пример модели на одном слое:
const model = tf.sequential();
model.add(tf.layers.dense({units: 2, inputShape: [3]}));
const input = tf.tensor([[1, 2, 3]]);
const output = model.predict(input); // вычисление происходит здесь
output.print();
Механизм ленивого выполнения позволяет:
Часто необходимо объединять ленивые вычисления и потоковую обработку. Это позволяет обучать модели на больших наборах данных, не загружая их целиком в память, и динамически применять преобразования к каждому батчу.
Пример:
const dataset = tf.data.generator(function*() {
for (let i = 0; i < 100; i++) {
yield tf.tensor([i, i+1, i+2]);
}
})
.batch(5)
.map(batch => batch.square());
await dataset.forEachAsync(batch => {
console.log('Batch:');
batch.print();
});
Здесь каждый батч обрабатывается лениво, то есть
batch.square() выполняется только при необходимости,
экономя ресурсы и ускоряя обработку.
tf.data позволяет работать с
большими данными без перегрузки памяти.tf.tidy() обеспечивает автоматическое
освобождение памяти для временных тензоров.Эти механизмы формируют основу эффективной работы с TensorFlow.js в браузере и на сервере с Node.js, позволяя создавать масштабируемые, высокопроизводительные приложения машинного обучения.