VGGNet

VGGNet представляет собой глубокую сверточную нейронную сеть, разработанную для классификации изображений с высоким качеством распознавания. Основная идея заключается в последовательном применении небольших сверток 3×3, что позволяет увеличивать глубину сети без значительного увеличения количества параметров. Сеть состоит из нескольких блоков сверточных слоев, каждый из которых завершается слоем подвыборки (pooling). После сверточных блоков следуют полносвязные слои, завершающие классификацию.

Ключевые особенности архитектуры VGGNet:

  • Использование только сверток 3×3 и пуллинга 2×2.
  • Последовательное наращивание глубины сети (16–19 слоев в наиболее популярных вариантах: VGG16 и VGG19).
  • Постепенное увеличение числа каналов (от 64 в первом блоке до 512 в последних).

Инициализация и создание сети в ConvNetJS

ConvNetJS предоставляет простой способ создания VGG-подобных сетей с использованием объекта Net. Основная последовательность действий:

var net = new convnetjs.Net();

Добавление слоев выполняется методом addLayer. Пример создания сверточного блока:

net.addLayer({type:'input', out_sx:224, out_sy:224, out_depth:3});
net.addLayer({type:'conv', sx:3, filters:64, stride:1, pad:1, activation:'relu'});
net.addLayer({type:'conv', sx:3, filters:64, stride:1, pad:1, activation:'relu'});
net.addLayer({type:'pool', sx:2, stride:2, pad:0, pooling_type:'max'});

Каждый блок включает несколько сверток и завершается слоем pool. Полносвязные слои добавляются после сверточной части:

net.addLayer({type:'fc', num_neurons:4096, activation:'relu'});
net.addLayer({type:'fc', num_neurons:4096, activation:'relu'});
net.addLayer({type:'softmax', num_classes:1000});

Сверточные и пуллинговые слои

Сверточный слой (conv) в ConvNetJS задается параметрами:

  • sx — размер ядра свертки (обычно 3 для VGGNet).
  • filters — количество фильтров (каналов выхода).
  • stride — шаг свертки (обычно 1).
  • pad — количество пикселей для паддинга.
  • activation — функция активации, чаще всего relu.

Применение нескольких сверток подряд увеличивает нелинейность и позволяет сети учить более сложные признаки.

Пуллинговый слой (pool) служит для уменьшения пространственного размера и снижения вычислительной нагрузки:

  • sx — размер окна (2 для стандартного max pooling).
  • stride — шаг (2 для уменьшения вдвое).
  • pooling_typemax или avg.

Полносвязные слои и функция softmax

Полносвязные слои (fc) выполняют классификацию после извлечения признаков сверточными блоками. Количество нейронов выбирается исходя из размера выходного тензора последнего свертки:

  • num_neurons — число нейронов, обычно 4096 для VGG16/19.
  • activation — функция активации (relu для промежуточных слоев).

Завершающий слой использует softmax для выдачи вероятностей классов. В ConvNetJS задается через:

{type:'softmax', num_classes:N}

где N — количество классов в задаче.


Инициализация весов и обучение

ConvNetJS автоматически инициализирует веса малым случайным значением из нормального распределения. Для обучения используется класс Trainer:

var trainer = new convnetjs.SGDTrainer(net, {
  method: 'adam',
  learning_rate: 0.001,
  momentum: 0.9,
  batch_size: 32,
  l2_decay: 0.0001
});

Важные параметры тренера:

  • learning_rate — скорость обучения, критический параметр для стабильной сходимости.
  • momentum — помогает ускорять обучение и избегать застревания в локальных минимумах.
  • l2_decay — регуляризация для предотвращения переобучения.
  • batch_size — размер мини-батча для градиентного спуска.

Обучение происходит методом train:

trainer.train(x, y);

где x — входное изображение в формате Vol, а y — целевой класс.


Применение сети и предсказания

После обучения сеть используется для предсказания через метод forward:

var prob = net.forward(x);
var predicted_class = prob.w.indexOf(Math.max.apply(null, prob.w));

forward возвращает объект Vol с массивом вероятностей w. Наибольшая вероятность определяет класс.


Работа с изображениями

ConvNetJS использует формат Vol для представления изображений. Преобразование RGB изображения 224×224 в Vol:

var x = new convnetjs.Vol(224, 224, 3);
for(var i=0;i<224;i++){
  for(var j=0;j<224;j++){
    x.set(i, j, 0, r[i][j]);
    x.set(i, j, 1, g[i][j]);
    x.set(i, j, 2, b[i][j]);
  }
}

Этот шаг является обязательным для корректного обучения и предсказания в VGGNet-подобной архитектуре.


Особенности реализации VGGNet в ConvNetJS

  • Поддержка только CPU, поэтому глубокие сети требуют оптимизации или уменьшения размера входа.
  • Возможность настройки количества фильтров и глубины сети без изменения основного кода.
  • Поддержка функций активации relu и sigmoid, что позволяет гибко экспериментировать с архитектурой.