TensorFlow.js предоставляет удобные инструменты для работы с датасетами и их комбинирования. Среди ключевых операций — zip и concatenate, позволяющие создавать сложные пайплайны обработки данных и готовить данные для обучения моделей.
Датасет в TensorFlow.js представлен объектом
tf.data.Dataset, который является ленивой
последовательностью элементов. Каждый элемент может быть тензором или
объектом с тензорами. Основная цель — удобное построение потоков данных
для обучения, тестирования и инференса.
Ключевые методы, влияющие на объединение данных:
dataset.zip(otherDataset) — объединяет два датасета
поэлементно, формируя пары.dataset.concatenate(otherDataset) — добавляет один
датасет в конец другого, формируя единый поток данных.zipzip объединяет два датасета
поэлементно. Каждый элемент нового датасета
представляет собой структуру, содержащую элементы из обоих исходных
потоков. Если один из датасетов короче другого, лишние элементы
игнорируются.
Синтаксис:
const zippedDataset = dataset1.zip(dataset2);
Пример использования:
const xs = tf.data.array([1, 2, 3]);
const ys = tf.data.array([10, 20, 30]);
const zipped = xs.zip(ys);
zipped.forEachAsync(pair => {
console.log(pair);
});
Результатом будут пары:
{0: 1, 1: 10}
{0: 2, 1: 20}
{0: 3, 1: 30}
Важно:
zipподдерживает и более сложные структуры данных. Если элементы датасетов являются объектами, ключи объектов сохраняются в результирующем датасете.
Применение в обучении: Метод особенно полезен для
сопоставления входов и меток при подготовке данных для
нейронной сети. Например, один датасет содержит изображения, другой —
метки классов, и zip позволяет создать поток
{xs, ys} для метода model.fitDataset().
concatenateconcatenate объединяет датасеты
последовательно, добавляя элементы второго датасета в
конец первого. В отличие от zip, порядок важен, а элементы
не формируют пары. Оба датасета должны иметь одинаковую структуру
элементов.
Синтаксис:
const combinedDataset = dataset1.concatenate(dataset2);
Пример использования:
const ds1 = tf.data.array([1, 2, 3]);
const ds2 = tf.data.array([4, 5, 6]);
const combined = ds1.concatenate(ds2);
combined.forEachAsync(item => {
console.log(item);
});
Результат:
1
2
3
4
5
6
Особенности применения:
Совместимость типов данных Перед объединением убедиться, что элементы датасетов имеют одинаковую структуру. Иначе произойдет ошибка времени выполнения.
Комбинирование методов Часто zip и
concatenate применяются вместе. Например, сначала создаются
пары {input, label} с помощью zip, затем
объединяются несколько датасетов этих пар с помощью
concatenate.
Ленивая обработка Объединённые датасеты остаются
ленивыми. Реальные элементы формируются только при итерации или вызове
метода forEachAsync. Это экономит память при работе с
большими массивами данных.
Использование с батчами После объединения датасета его можно разбить на батчи:
const batched = combinedDataset.batch(32);
Это упрощает обучение моделей с большими объемами данных, гарантируя, что каждое обновление градиента будет выполняться на фиксированном размере мини-батча.
zip и
concatenate| Характеристика | zip | concatenate |
|---|---|---|
| Тип объединения | поэлементно, создаёт пары | последовательно, добавляет элементы |
| Структура элементов | комбинируется в объект/кортеж | сохраняется как есть |
| Применение | вход-выход, пары данные/метки | объединение наборов данных |
| Ограничения | разная длина датасетов обрезается | структуры элементов должны совпадать |
zip — инструмент для построения пар
данных, идеален для подготовки входов и меток.concatenate — инструмент для увеличения объема
данных, удобен при работе с разными источниками одного типа
данных.