Слои объединения и разделения: Concatenate, Add, Multiply, Split

Библиотека Keras.js предоставляет возможность работать с нейронными сетями прямо в браузере на JavaScript, обеспечивая перенос моделей, обученных в Python Keras, в веб-приложения. Одной из ключевых групп слоев являются слои объединения и разделения, которые позволяют гибко комбинировать и разветвлять потоки данных внутри модели.


Concatenate

Слой Concatenate выполняет объединение нескольких входных тензоров вдоль заданной оси. Это особенно важно при работе с многопоточными архитектурами, где необходимо соединить результаты параллельных ветвей.

Основные параметры:

  • axis — ось, вдоль которой происходит конкатенация. По умолчанию -1 (последняя ось, чаще всего канал).
  • name — уникальное имя слоя в модели.

Пример использования:

const keras = require('keras-js');

const input1 = new keras.layers.Input({shape: [32]});
const input2 = new keras.layers.Input({shape: [32]});

const concatenated = new keras.layers.Concatenate({axis: 1}).apply([input1, input2]);

В этом примере два входных вектора длиной 32 соединяются вдоль оси 1, создавая результирующий тензор длиной 64. Concatenate поддерживает соединение более двух входов одновременно.

Особенности:

  • Входные тензоры должны совпадать по размерности на всех осях, кроме выбранной для конкатенации.
  • Используется в моделях с несколькими параллельными потоками, например, в архитектуре Inception.

Add

Слой Add выполняет поэлементное сложение нескольких тензоров одинаковой формы. Это удобно для реализации остаточных соединений, как в ResNet.

Параметры:

  • name — имя слоя для идентификации в модели.

Пример:

const added = new keras.layers.Add().apply([tensor1, tensor2]);

Ключевые моменты:

  • Все входные тензоры должны иметь одинаковую форму.
  • Используется для объединения сигналов с одинаковыми размерами без увеличения размерности.
  • Часто применяется для построения residual блоков, когда необходимо добавить выход блока к входу.

Multiply

Слой Multiply выполняет поэлементное умножение входных тензоров. Отличается от Add тем, что результат зависит от произведения значений, что позволяет реализовывать механизмы взвешивания потока данных.

Пример использования:

const multiplied = new keras.layers.Multiply().apply([tensor1, tensor2]);

Особенности применения:

  • Форма всех входных тензоров должна совпадать.
  • Часто применяется в моделях с вниманием (attention), где один поток используется как маска или вес для другого.

Split

Слой Split позволяет разделить один тензор на несколько частей вдоль указанной оси. Это важно для организации параллельной обработки различных сегментов данных.

Параметры:

  • num_or_size_splits — количество частей или массив размеров каждой части.
  • axis — ось разделения.
  • name — имя слоя.

Пример:

const splitTensors = new keras.layers.Lambda({
  function: (x) => {
    const [a, b] = tf.split(x, 2, 1); // Разделение вдоль оси 1 на 2 части
    return [a, b];
  }
}).apply(inputTensor);

Ключевые моменты:

  • Разделение может быть равномерным или по заданным размерам.
  • Используется для распределения данных по параллельным ветвям сети.
  • В Keras.js отсутствует прямой слой Split, поэтому применяются Lambda-функции для деления тензоров.

Практическое использование

Комбинация Concatenate, Add, Multiply и Split позволяет строить сложные архитектуры нейронных сетей:

  • Concatenate объединяет параллельные ветви, увеличивая количество признаков.
  • Add и Multiply обеспечивают поэлементное взаимодействие потоков, реализуя остаточные или внимательные соединения.
  • Split дает возможность организовать несколько независимых вычислительных веток из одного тензора.

Эти слои составляют фундамент для построения современных архитектур типа Inception, ResNet, DenseNet, где важна гибкая маршрутизация данных.


Если требуется, можно добавить наглядные схемы потоков данных, показывающие, как тензоры соединяются и разделяются между слоями. Это особенно полезно для сложных сетей с несколькими ветвями.