Stride и padding

В нейронных сетях, построенных на свёрточных слоях, такие параметры как stride и padding играют ключевую роль в управлении пространственными размерами признаковых карт (feature maps) и эффективности обучения. ConvNetJS, являясь библиотекой для реализации нейронных сетей в JavaScript, предоставляет прямые возможности для настройки этих параметров при создании свёрточных слоёв.


Stride

Stride определяет шаг, с которым фильтр свёртки перемещается по входной матрице. В ConvNetJS этот параметр задаётся при создании слоя conv_layer. Например:

var layer = new convnetjs.ConvLayer({
    sx: 5,       // размер фильтра 5x5
    filters: 16, // количество фильтров
    stride: 2,   // шаг свёртки
    pad: 0       // без паддинга
});
  • stride = 1 означает, что фильтр смещается на один пиксель за раз по горизонтали и вертикали. Это приводит к максимальному сохранению пространственной информации и минимальному уменьшению размеров выходной карты признаков.
  • stride > 1 уменьшает размер выходного изображения, так как фильтр “перескакивает” через несколько пикселей. Это полезно для уменьшения вычислительной нагрузки и снижения разрешения признаковых карт на ранних слоях сети.

Формула для вычисления размеров выходной карты признаков:

[ W_{out} = + 1]

где:

  • (W_{in}) — ширина входного изображения
    1. — размер фильтра (kernel)
    1. — паддинг
    1. — stride

Аналогично для высоты.

Пример: вход 28×28, фильтр 5×5, stride 2, pad 0:

[ W_{out} = + 1 = + 1 = 12.5 + 1]

Так как размер карты признаков должен быть целым числом, ConvNetJS округляет вниз, получаем 13×13.


Padding

Padding (дополнение нулями) добавляет вокруг входного изображения рамку из нулей. Цель — управлять размером выходной карты признаков и предотвращение сильного уменьшения размеров при последовательных свёртках. В ConvNetJS задаётся параметром pad:

var layer = new convnetjs.ConvLayer({
    sx: 3,        // размер фильтра 3x3
    filters: 32,  // количество фильтров
    stride: 1,
    pad: 1        // добавление рамки из нулей
});
  • pad = 0 — без дополнения, размер карты признаков уменьшается на каждом свёрточном слое.
  • pad > 0 — добавление нулевой рамки вокруг изображения, что позволяет сохранить пространственные размеры при определённых комбинациях фильтра и stride.

Пример: вход 28×28, фильтр 3×3, stride 1, pad 1:

[ W_{out} = + 1 = + 1 = 28]

Таким образом, карта признаков сохраняет исходный размер 28×28.


Влияние на обучение и эффективность

  • Stride уменьшает разрешение карты признаков, что снижает объём вычислений и количество параметров в последующих слоях. Высокие значения stride полезны на ранних слоях для быстрого уменьшения размера изображения.
  • Padding помогает сохранить информацию на границах изображения. Без паддинга важные признаки, находящиеся на краях, могут теряться после нескольких свёрток.
  • Комбинация stride и padding позволяет гибко управлять глубиной и размером сети. Например, использование stride 2 и pad 1 может дать схожее уменьшение размеров карты признаков, как stride 1 и pad 0, но с сохранением краевых признаков.

Практическое использование в ConvNetJS

ConvNetJS позволяет комбинировать stride и padding с другими параметрами слоя:

  • sx — размер фильтра
  • filters — количество фильтров
  • activation — функция активации (ReLU, sigmoid, tanh)

Пример сложного свёрточного блока:

var layer1 = new convnetjs.ConvLayer({sx: 5, filters: 16, stride: 1, pad: 2, activation: 'relu'});
var layer2 = new convnetjs.PoolLayer({sx: 2, stride: 2}); // подвыборка
var layer3 = new convnetjs.ConvLayer({sx: 3, filters: 32, stride: 1, pad: 1, activation: 'relu'});

В этом примере padding позволяет сохранять размеры карты признаков, stride в подвыборке уменьшает их, создавая эффективную иерархию признаков без потери информации на границах.


Резюме ключевых принципов

  • Stride регулирует шаг фильтра и напрямую влияет на размер выходной карты признаков.
  • Padding добавляет рамку, предотвращая потерю краевых признаков.
  • Формула вычисления размеров выходной карты: [ W_{out} = + 1]
  • Правильное сочетание stride и padding позволяет строить глубокие сети с контролируемой вычислительной нагрузкой и эффективным использованием признаков.

Stride и padding являются фундаментальными параметрами, которые требуют тщательной настройки для достижения оптимальной производительности свёрточной нейронной сети в ConvNetJS.