Pooling — это ключевой элемент сверточных нейронных сетей (CNN), предназначенный для снижения размерности признаковых карт и выделения устойчивых характеристик изображения. ConvNetJS предоставляет удобный интерфейс для реализации различных видов pooling-слоев, среди которых наиболее часто используются MaxPooling и AveragePooling.
Pooling-слой принимает на вход трехмерный тензор
признаков с размерностью
(ширина × высота × глубина) и уменьшает его
пространственные размеры (ширина × высота), сохраняя
глубину. Основная цель:
В ConvNetJS pooling-слои создаются с помощью конструктора
convnetjs.Layer, где указывается тип слоя
('pool') и его параметры.
var layer_def = {};
layer_def.type = 'pool';
layer_def.sx = 2; // размер окна по ширине
layer_def.sy = 2; // размер окна по высоте
layer_def.stride = 2; // шаг окна
layer_def.pad = 0; // padding
layer_def.pooling_type = 'max'; // или 'avg' для AveragePooling
var pool_layer = new convnetjs.PoolLayer(layer_def);
MaxPooling выбирает максимальное значение из каждого
окна размера (sx × sy). Это делает слой чувствительным к
наиболее выраженным признакам, игнорируя менее значимые значения.
Преимущества:
Пример работы:
Если окно 2×2 охватывает значения [1, 3; 2, 0],
результат MaxPooling будет 3.
var layer_def = { type:'pool', sx:2, sy:2, stride:2, pooling_type:'max' };
var maxpool_layer = new convnetjs.PoolLayer(layer_def);
После применения MaxPooling к признаковой карте размер
(4×4) станет (2×2) при stride = 2.
AveragePooling вычисляет среднее значение по каждому окну. Этот метод менее агрессивен, чем MaxPooling, так как учитывает все значения признаков, а не только экстремальные.
Преимущества:
Пример:
Если окно 2×2 содержит [1, 3; 2, 0], результат
AveragePooling будет (1+3+2+0)/4 = 1.5.
var layer_def = { type:'pool', sx:2, sy:2, stride:2, pooling_type:'avg' };
var avgpool_layer = new convnetjs.PoolLayer(layer_def);
'max' для MaxPooling,
'avg' для AveragePooling.Оптимальный выбор параметров зависит от архитектуры сети:
stride и sx уменьшают размер карты
быстрее, но могут терять детали;stride сохраняет больше информации, но снижает
эффект сжатия.var layer_defs = [];
layer_defs.push({type:'input', sx:32, sy:32, depth:3});
layer_defs.push({type:'conv', sx:5, filters:16, stride:1, pad:2, activation:'relu'});
layer_defs.push({type:'pool', sx:2, sy:2, stride:2, pooling_type:'max'});
var layer_defs = [];
layer_defs.push({type:'input', sx:28, sy:28, depth:1});
layer_defs.push({type:'conv', sx:3, filters:8, stride:1, pad:1, activation:'relu'});
layer_defs.push({type:'pool', sx:2, sy:2, stride:2, pooling_type:'avg'});
| Параметр | MaxPooling | AveragePooling |
|---|---|---|
| Основная идея | Выбирает максимальное значение | Вычисляет среднее значение |
| Влияние на шум | Игнорирует мелкие шумы | Сглаживает шум |
| Сохранение признаков | Сохраняет сильные локальные активации | Сохраняет общие закономерности |
| Часто используется | Классификация, CNN с ReLU | Регрессия, предварительная обработка |
Эти принципы позволяют эффективно использовать pooling-слои в ConvNetJS, управлять размерностью признаковых карт и улучшать устойчивость моделей к вариациям входных данных.