Пакетная обработка (batch processing) — ключевой механизм для
эффективного обучения нейронных сетей. В TensorFlow.js пакет данных
представляется в виде тензоров, где первый размер (ось
0) обычно соответствует размеру пакета (batch size). Это
позволяет одновременно обрабатывать несколько образцов, ускоряя
вычисления на GPU и уменьшая шум градиентов.
import * as tf from '@tensorflow/tfjs';
const batchSize = 32;
const inputShape = [batchSize, 28, 28, 1]; // пакет из 32 изображений 28x28
const xBatch = tf.randomNormal(inputShape);
Ключевой момент: всегда сохранять консистентность
размерности тензоров. Если модель ожидает вход
[batch, height, width, channels], каждый пакет должен
соответствовать этому формату.
Размер пакета влияет на:
Для динамического изменения размера пакета при обучении можно использовать итераторы и генераторы:
function* dataGenerator(data, labels, batchSize) {
for (let i = 0; i < data.length; i += batchSize) {
const xBatch = data.slice(i, i + batchSize);
const yBatch = labels.slice(i, i + batchSize);
yield {xs: tf.tensor(xBatch), ys: tf.tensor(yBatch)};
}
}
tf.data для пакетной обработкиTensorFlow.js предоставляет высокоуровневый API tf.data
для работы с потоками данных. Основные функции:
fromTensorSlices: превращает тензор
или массивы в источник данных.batch(size): группирует элементы в
пакеты.shuffle(bufferSize): перемешивает
данные перед формированием пакета.repeat(count): повторяет источник
данных заданное количество раз.Пример:
const data = tf.data.array([1, 2, 3, 4, 5, 6]);
const batched = data.batch(2);
batched.forEachAsync(batch => batch.print());
В реальных задачах пакетная обработка изображений или текста часто
комбинируется с шагом перемешивания
(shuffle), чтобы уменьшить корреляцию между
последовательными пакетами.
TensorFlow.js работает эффективно при векторизации операций по пакетам. Любые циклы по отдельным образцам нужно заменять на операции над всей матрицей:
// Менее эффективно
for (let i = 0; i < batchSize; i++) {
y[i] = x[i].mul(w);
}
// Векторизировано
const y = x.matMul(w);
Каждое создание тензора использует память GPU. Для пакетной обработки это критично. Используются методы:
tf.tidy: автоматически очищает
временные тензоры.dispose(): вручную освобождает память,
если тензор больше не нужен.tf.tidy(() => {
const result = xBatch.matMul(weights);
result.print();
}); // result будет автоматически очищен после выхода из tf.tidy
const augmentedData = data.map(({xs, ys}) => {
return {
xs: xs.add(tf.randomNormal(xs.shape, 0, 0.1)), // шум как аугментация
ys
};
}).batch(batchSize);
Обновление весов в модели происходит по среднему градиенту
пакета. TensorFlow.js позволяет контролировать этот процесс
через оптимизаторы и функцию minimize:
const optimizer = tf.train.adam(0.001);
optimizer.minimize(() => {
const predictions = model.predict(xBatch);
return tf.losses.meanSquaredError(yBatch, predictions);
});
Особенности:
batchSize должен согласовываться с размером памяти
GPU/CPU.batchSize = 32 или 64
для небольших наборов данных, постепенно увеличивать при достаточной
памяти.tf.data для потоков данных: это
упрощает пакетирование, перемешивание и аугментацию.tf.memory().Эта структура пакетной обработки обеспечивает эффективное использование ресурсов, стабильность обучения и масштабируемость на большие наборы данных, что делает TensorFlow.js мощным инструментом для разработки нейросетевых моделей в браузере и на сервере.