VGGNet представляет собой глубокую сверточную нейронную сеть, разработанную для классификации изображений с высоким качеством распознавания. Основная идея заключается в последовательном применении небольших сверток 3×3, что позволяет увеличивать глубину сети без значительного увеличения количества параметров. Сеть состоит из нескольких блоков сверточных слоев, каждый из которых завершается слоем подвыборки (pooling). После сверточных блоков следуют полносвязные слои, завершающие классификацию.
Ключевые особенности архитектуры VGGNet:
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_type — max или
avg.Полносвязные слои (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-подобной архитектуре.
relu и
sigmoid, что позволяет гибко экспериментировать с
архитектурой.