Слои пулинга (Pooling) играют ключевую роль в сверточных нейронных сетях, снижая пространственные размеры входных данных и сокращая вычислительные затраты. В TensorFlow.js реализованы несколько основных типов пулинга: MaxPooling2D, AveragePooling2D и GlobalAveragePooling2D, каждый из которых имеет свои особенности применения и поведения.
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 работает аналогично MaxPooling2D, но вместо максимума вычисляет среднее значение элементов окна. Этот метод лучше подходит, когда важна интегральная информация о признаках, а не только самые яркие активации.
Основные параметры:
poolSize – размер окна, например
[2, 2].strides – шаг сдвига окна.padding – 'valid' или
'same'.Пример:
const avgPoolLayer = tf.layers.averagePooling2d({
poolSize: [2, 2],
strides: [2, 2],
padding: 'same'
});
Особенности AveragePooling2D:
GlobalAveragePooling2D выполняет усреднение по всем
пространственным измерениям входного тензора, превращая тензор с
размерностью [height, width, channels] в
[channels]. Часто применяется перед полносвязными слоями,
сокращая количество параметров без потери информации о каналах.
Пример создания слоя:
const globalAvgPoolLayer = tf.layers.globalAveragePooling2d();
Особенности:
| Слой | Тип агрегации | Сокращение размерности | Особенности |
|---|---|---|---|
| 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' }));
В этой архитектуре слои пулинга постепенно сокращают пространственные размеры, извлекая ключевые признаки и снижая вычислительную нагрузку, а глобальный средний пулинг формирует компактное представление перед классификацией.