Слои пулинга: MaxPooling2D, AveragePooling2D, GlobalAveragePooling2D

Слои пулинга (Pooling) играют ключевую роль в сверточных нейронных сетях, снижая пространственные размеры входных данных и сокращая вычислительные затраты. В TensorFlow.js реализованы несколько основных типов пулинга: MaxPooling2D, AveragePooling2D и GlobalAveragePooling2D, каждый из которых имеет свои особенности применения и поведения.


MaxPooling2D

MaxPooling2D выбирает максимальное значение из заданного окна (kernel) по каждой области входного тензора. Это позволяет извлекать наиболее выраженные признаки, сохраняя локальную информацию о сильных активациях.

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

  • poolSize – размер окна пулинга, обычно [2, 2] или [3, 3]. Определяет, из какой области будет выбрано максимальное значение.
  • strides – шаг окна пулинга. Если не задан, принимается равным poolSize.
  • padding – стратегия добавления границ: 'valid' (без добавления) или 'same' (дополнение, чтобы сохранить размеры входа).

Пример создания слоя:

const maxPoolLayer = tf.layers.maxPooling2d({
  poolSize: [2, 2],
  strides: [2, 2],
  padding: 'valid'
});

Эффект от применения MaxPooling2D:

  • Уменьшение размера пространственных измерений тензора (ширина и высота).
  • Сохранение сильных признаков в каждой области.
  • Снижение риска переобучения за счёт уменьшения числа параметров.

AveragePooling2D

AveragePooling2D работает аналогично MaxPooling2D, но вместо максимума вычисляет среднее значение элементов окна. Этот метод лучше подходит, когда важна интегральная информация о признаках, а не только самые яркие активации.

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

  • poolSize – размер окна, например [2, 2].
  • strides – шаг сдвига окна.
  • padding'valid' или 'same'.

Пример:

const avgPoolLayer = tf.layers.averagePooling2d({
  poolSize: [2, 2],
  strides: [2, 2],
  padding: 'same'
});

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

  • Сглаживание активаций, что уменьшает влияние резких выбросов.
  • Более мягкая редукция пространственного размера по сравнению с MaxPooling2D.
  • Используется в архитектурах, где важно сохранить контекстные признаки.

GlobalAveragePooling2D

GlobalAveragePooling2D выполняет усреднение по всем пространственным измерениям входного тензора, превращая тензор с размерностью [height, width, channels] в [channels]. Часто применяется перед полносвязными слоями, сокращая количество параметров без потери информации о каналах.

Пример создания слоя:

const globalAvgPoolLayer = tf.layers.globalAveragePooling2d();

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

  • Полная редукция пространственных измерений.
  • Сильная регуляризация, так как уменьшает количество параметров перед полносвязными слоями.
  • Часто используется в современных архитектурах сверточных сетей, таких как ResNet и MobileNet.

Сравнение подходов

Слой Тип агрегации Сокращение размерности Особенности
MaxPooling2D максимум Умеренное Выбирает сильные признаки
AveragePooling2D среднее Умеренное Сглаживает активации, учитывает контекст
GlobalAveragePooling2D среднее по всему пространству Максимальное Преобразует 3D-тензор в вектор, снижает количество параметров

Практические советы

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

  • AveragePooling2D полезен для сглаживания шумных входов и при работе с текстурными изображениями.

  • GlobalAveragePooling2D подходит для замены полносвязных слоев и уменьшения переобучения в глубоких сетях.

  • Выбор strides влияет на степень уменьшения размера: равные poolSize полностью исключают перекрытие, меньшие значения создают перекрывающийся пулинг.

  • Стратегия padding='same' сохраняет размеры тензора, что удобно при построении сетей с симметричной архитектурой.


Пример комбинации слоев

const model = tf.sequential();
model.add(tf.layers.conv2d({
  inputShape: [64, 64, 3],
  filters: 32,
  kernelSize: 3,
  activation: 'relu'
}));
model.add(tf.layers.maxPooling2d({ poolSize: [2, 2], strides: [2, 2] }));
model.add(tf.layers.conv2d({
  filters: 64,
  kernelSize: 3,
  activation: 'relu'
}));
model.add(tf.layers.averagePooling2d({ poolSize: [2, 2] }));
model.add(tf.layers.globalAveragePooling2d());
model.add(tf.layers.dense({ units: 10, activation: 'softmax' }));

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