Параметры фильтров

Библиотека 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 задают регуляризацию, предотвращающую переобучение фильтров.

Примеры комбинаций параметров

  1. Малый фильтр, высокий stride, без паддинга:
{type:'conv', filters:8, size:3, stride:2, pad:0}
  • Быстрое уменьшение размера карты признаков.
  • Подходит для грубого выделения контуров на больших изображениях.
  1. Большой фильтр, 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, оптимально выделяющие признаки на разных уровнях абстракции.