Библиотека ConvNetJS предоставляет инструменты для построения
сверточных нейронных сетей непосредственно в JavaScript. Центральным
элементом таких сетей являются сверточные слои, которые используют
фильтры (kernels) для выделения признаков на изображениях. Понимание
параметров фильтров критично для правильной настройки сети и
эффективного обучения.
Размер фильтра (filter size)
Размер фильтра определяет, какую область входного
изображения обрабатывает один нейрон сверточного слоя. В ConvNetJS он
задается как целое число (например, 3, 5, 7), что соответствует
квадратному фильтру NxN:
var layer = {type:'conv', filters:16, size:5, stride:1, pad:2};
size: 5 — фильтр будет размером 5x5.
- Большие фильтры захватывают более глобальные признаки, такие как
формы и контуры.
- Малые фильтры (3x3) лучше подходят для детектирования локальных
деталей и позволяют строить более глубокие сети при меньшем количестве
параметров.
Количество фильтров
(number of filters)
Количество фильтров определяет, сколько различных
признаков может быть выделено на данном слое:
filters: 32
- Каждый фильтр создаёт отдельную карту признаков (feature map).
- Увеличение числа фильтров повышает способность сети к распознаванию
сложных паттернов, но увеличивает вычислительные затраты.
- В типичной архитектуре количество фильтров увеличивается с ростом
глубины сети (например, 16 → 32 → 64).
Шаг свёртки (stride)
Stride задаёт смещение фильтра при сканировании
изображения:
stride: 1
stride = 1 — фильтр сдвигается по одному пикселю,
создавая максимально подробные карты признаков.
stride > 1 уменьшает размер карты признаков, что
экономит память и ускоряет вычисления, но снижает детализацию.
Паддинг (padding)
Padding добавляет рамку нулей вокруг входного
изображения для сохранения размеров карты признаков после свёртки:
pad: 1
pad = 0 — размеры карты признаков уменьшаются после
свёртки.
pad = floor(size/2) — позволяет сохранить размеры
исходного изображения.
- Padding важен при глубоких сетях, чтобы избежать слишком сильного
уменьшения размеров признаковых карт.
Инициализация фильтров
Фильтры в ConvNetJS инициализируются случайными значениями с малой
дисперсией:
var layer = {type:'conv', filters:16, size:5, stride:1, pad:2, l1_decay:0.001, l2_decay:0.001};
- Правильная инициализация влияет на сходимость обучения.
- L1 и L2 decay задают регуляризацию, предотвращающую переобучение
фильтров.
Примеры комбинаций
параметров
- Малый фильтр, высокий stride, без паддинга:
{type:'conv', filters:8, size:3, stride:2, pad:0}
- Быстрое уменьшение размера карты признаков.
- Подходит для грубого выделения контуров на больших
изображениях.
- Большой фильтр, stride = 1, с паддингом:
{type:'conv', filters:32, size:7, stride:1, pad:3}
- Сохраняет размеры входа.
- Выделяет крупные структуры изображения.
Связь параметров
фильтров с архитектурой сети
- Размер фильтра и шаг напрямую влияют на размер карты признаков
(
output width = (input width + 2*pad - filter size)/stride + 1).
- Паддинг позволяет глубоко строить сеть без уменьшения карты
признаков до размера 1x1 слишком рано.
- Количество фильтров определяет ширину слоя, а их комбинация с шагом
и паддингом формирует пространственное разрешение и детализацию
признаков.
Практические рекомендации
- Использовать 3x3 фильтры с stride 1 и паддингом 1
для большинства сверточных блоков — проверенная практика глубоких
сетей.
- Увеличивать число фильтров по мере углубления сети, чтобы
компенсировать потерю пространственной информации.
- Экспериментировать с padding и stride для оптимального баланса между
детализацией и вычислительной эффективностью.
Понимание этих параметров позволяет строить эффективные сверточные
архитектуры в ConvNetJS, оптимально выделяющие признаки на разных
уровнях абстракции.