TensorFlow.js предоставляет мощные инструменты для работы с многомерными массивами данных — тензорами. Конкатенация и разбиение тензоров являются базовыми операциями для формирования входных данных, подготовки батчей, создания сложных моделей и обработки результатов.
Конкатенация позволяет объединять два или более тензоров вдоль выбранной оси. Это особенно важно при необходимости сшивания данных различных источников или объединения промежуточных результатов вычислений.
Основная функция для конкатенации:
tf.concat(tensors, axis)
tensors — массив тензоров, которые необходимо
объединить.axis — ось, вдоль которой производится объединение. По
умолчанию axis = 0.Пример:
const a = tf.tensor2d([[1, 2], [3, 4]]);
const b = tf.tensor2d([[5, 6], [7, 8]]);
const c = tf.concat([a, b], 0); // Конкатенация по первой оси (строки)
c.print();
// Результат:
// [[1, 2],
// [3, 4],
// [5, 6],
// [7, 8]]
const d = tf.concat([a, b], 1); // Конкатенация по второй оси (столбцы)
d.print();
// Результат:
// [[1, 2, 5, 6],
// [3, 4, 7, 8]]
Ключевые моменты при конкатенации:
axis = 0 часто используется для объединения батчей
данных, а axis = 1 — для добавления признаков.Разбиение тензора позволяет делить его на несколько частей по выбранной оси. Это полезно для обработки больших данных по частям или для выделения признаков.
Основная функция:
tf.split(x, numOrSizeSplits, axis)
x — исходный тензор.numOrSizeSplits — либо число частей, на которые нужно
разделить тензор (равномерно), либо массив размеров каждой части.axis — ось, вдоль которой производится разбиение.Примеры:
const x = tf.tensor1d([1, 2, 3, 4]);
const [a, b] = tf.split(x, 2);
a.print(); // [1, 2]
b.print(); // [3, 4]
const y = tf.tensor1d([1, 2, 3, 4, 5]);
const [p, q, r] = tf.split(y, [2, 2, 1]);
p.print(); // [1, 2]
q.print(); // [3, 4]
r.print(); // [5]
Ключевые моменты при разбиении:
Часто в моделях машинного обучения требуется сначала объединить данные, а затем разложить их по группам. Например, при реализации кастомного слоя, который объединяет признаки нескольких источников, а затем разбивает результат на батчи для отдельных обработок.
Пример с двумерными тензорами:
const t1 = tf.tensor2d([[1, 2], [3, 4]]);
const t2 = tf.tensor2d([[5, 6], [7, 8]]);
// Конкатенация по строкам
const combined = tf.concat([t1, t2], 0);
// Разбиение на два блока
const [block1, block2] = tf.split(combined, 2, 0);
block1.print();
// [[1, 2],
// [3, 4]]
block2.print();
// [[5, 6],
// [7, 8]]
Такое сочетание позволяет динамически манипулировать тензорами, создавать сложные архитектуры и легко перераспределять данные между слоями нейронной сети.
tf.tidy, чтобы автоматически
освобождать память.axis = 0) удобно
объединять батчи входных данных.numOrSizeSplits как
массив) полезно при работе с последовательностями разной длины или при
разбиении изображений на регионы.Конкатенация и разбиение тензоров являются фундаментальными инструментами для построения динамичных моделей в TensorFlow.js. Их правильное использование обеспечивает гибкость в обработке данных, эффективное управление памятью и легкость интеграции с другими операциями библиотеки.