Пулинг слои (pooling layers) являются неотъемлемой частью сверточных
нейронных сетей, обеспечивая снижение размерности признаковых
карт и повышение устойчивости модели к смещениям, поворотам и
шуму в изображениях. В библиотеке ConvNetJS пулинг
реализуется через объекты класса Vol и специализированные
слои PoolLayer.
Пулинг применяется после сверточных слоев для уменьшения пространственного разрешения признаковых карт при сохранении наиболее важных признаков. Это позволяет:
ConvNetJS поддерживает несколько основных типов пулинга:
Max-pooling Наиболее часто используемый тип. Из
каждой области размером sx × sy выбирается
максимальное значение. Это позволяет выделять самые
выраженные признаки, сохраняя их важность при уменьшении размера
карты.
Average-pooling Рассчитывается среднее значение
по каждой области sx × sy. Используется реже, подходит для
задач, где важна средняя активность признаков, а не
только их максимальное проявление.
Global-pooling Осуществляет свертку всей карты в одно значение на канал, например, при классификации глобально агрегирует информацию о признаках.
Слой пулинга создается с помощью объекта конфигурации, передаваемого
в конструктор Layer:
var layer_def = {};
layer_def.type = 'pool';
layer_def.sx = 2; // размер окна по ширине
layer_def.sy = 2; // размер окна по высоте
layer_def.stride = 2; // шаг окна
layer_def.pad = 0; // нулевая подкладка
var poolLayer = new convnetjs.PoolLayer(layer_def);
Ключевые параметры:
sx и sy — размеры окна пулинга.stride — шаг перемещения окна по входной карте.pad — добавление нулей по краям карты (позволяет
сохранить размерность при необходимости).Важной особенностью ConvNetJS является то, что выбор типа
пулинга по умолчанию — max-pooling, но можно явно указать
method: 'avg' для среднего пулинга.
Пулинг слой обрабатывает входной тензор Vol и формирует
выходной тензор меньшей размерности. Алгоритм max-pooling можно описать
следующим образом:
stride.sx × sy выбираем максимальное
значение.Пример кода для forward pass:
var inputVol = new convnetjs.Vol(4, 4, 1); // вход 4x4x1
inputVol.w = [
1, 2, 3, 0,
4, 5, 6, 1,
7, 8, 9, 2,
0, 1, 2, 3
];
poolLayer.forward(inputVol);
console.log(poolLayer.out.w); // выводит уменьшенную карту
Результат — карта размером 2x2x1, содержащая
максимальные значения из каждой области 2×2.
Для обратного распространения градиентов используется запоминание позиции максимального элемента на этапе forward pass. Градиенты передаются только на те элементы, которые участвовали в max-пooling:
poolLayer.backward(dout);
Если используется average-pooling, градиенты распределяются равномерно по всем элементам области пулинга.
Выбор окна и шага: Чаще всего
sx = sy = 2 и stride = 2, что уменьшает размер
карты в 4 раза. Более крупные окна сокращают размерность сильнее, но
могут терять детали.
Сочетание с padding: Padding обычно не используется в пулинге, но может быть полезен, если нужно сохранить размеры карты при определенных архитектурах.
Регуляризация: Пулинг сам по себе снижает вероятность переобучения за счет уменьшения числа параметров и пространственной агрегации.
Слои подряд: В сложных сетях несколько слоев пулинга подряд создают иерархию признаков: от мелких деталей к глобальным объектам.
Классическая схема:
conv -> relu -> poolconv -> relu -> poolfc -> softmaxЗдесь каждый пулинг слой уменьшает пространственные размеры карты, позволяя последующему полносвязному слою обрабатывать компактное представление признаков.
Сетка с average-pooling: Иногда используется в сетях для сегментации и анализа текстур, где важны средние значения признаков, а не экстремальные.
Для анализа работы сети удобно выводить карты признаков до и после
пулинга. Max-pooling наглядно показывает, какие области акцентированы
сетью, а average-pooling — распределение активности. ConvNetJS позволяет
легко получать .w у тензора Vol и
визуализировать его через canvas или консоль.
Пулинг слои являются базовым инструментом формирования устойчивых и компактных признаковых представлений. Правильный выбор типа пулинга, размера окна и шага позволяет оптимизировать производительность сети, сохраняя ключевую информацию и снижая вычислительные затраты.