Построение классификатора

ConvNetJS — это чисто JavaScript-библиотека для создания и обучения нейронных сетей прямо в браузере или в среде Node.js. Она позволяет реализовывать как полносвязные сети (fully connected), так и сверточные нейронные сети (CNN) без необходимости установки сложных зависимостей.

Ключевые особенности:

  • Поддержка разных типов слоев: Dense (полносвязные), Conv (сверточные), Pool (подвыборка), Dropout.
  • Использование Stochastic Gradient Descent (SGD) и его модификаций.
  • Возможность работы с многоклассовой классификацией.
  • Встроенные функции визуализации и отладки.

Структура сети

В ConvNetJS сеть строится как последовательность слоев, каждый из которых обрабатывает входные данные и передает результат следующему.

Пример слоев:

  1. Dense (полносвязный слой)

    {type:'fc', num_neurons:100, activation:'relu'}
    • num_neurons — количество нейронов в слое.
    • activation — функция активации: relu, sigmoid, tanh, softmax.
  2. Conv (сверточный слой)

    {type:'conv', sx:5, filters:16, stride:1, pad:2, activation:'relu'}
    • sx — размер фильтра.
    • filters — количество фильтров.
    • stride — шаг свертки.
    • pad — количество нулей для заполнения границ.
  3. Pool (слой подвыборки)

    {type:'pool', sx:2, stride:2}
    • sx — размер окна подвыборки.
    • stride — шаг перемещения окна.
  4. Dropout (слой регуляризации)

    {type:'dropout', p:0.5}
    • p — вероятность отключения нейронов для уменьшения переобучения.

Инициализация сети

Сеть создается через объект convnetjs.Net и настраивается методом makeLayers:

var net = new convnetjs.Net();
net.makeLayers([
  {type:'input', out_sx:28, out_sy:28, out_depth:1},
  {type:'conv', sx:5, filters:8, stride:1, pad:2, activation:'relu'},
  {type:'pool', sx:2, stride:2},
  {type:'fc', num_neurons:64, activation:'relu'},
  {type:'softmax', num_classes:10}
]);

Примечания:

  • input слой определяет размер входного изображения или массива признаков.
  • Последний слой softmax используется для многоклассовой классификации.

Настройка оптимизатора

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

var trainer = new convnetjs.Trainer(net, {
  method:'sgd',        // алгоритм оптимизации
  learning_rate:0.01,  // скорость обучения
  l2_decay:0.001,      // коэффициент L2-регуляризации
  batch_size:20        // размер мини-батча
});

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

Подготовка данных

Входные данные должны быть представлены в виде объектов convnetjs.Vol:

var x = new convnetjs.Vol([0.0, 1.0, 2.0, 3.0]);
var y = 2; // метка класса

Для изображений часто используют одномерные массивы или нормализованные пиксели (0..1).

Процесс обучения

Обучение происходит методом train или через вызов trainer.train:

var stats = trainer.train(x, y);
console.log('Loss:', stats.loss);
  • x — входной вектор или изображение.
  • y — индекс класса.
  • stats.loss — значение функции потерь на текущем шаге.

Мини-батчи помогают стабилизировать градиенты и ускоряют обучение.

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

После обучения сеть используется для классификации:

var predicted_class = net.forward(x).w.indexOf(Math.max(...net.forward(x).w));
  • Метод forward возвращает объект Vol, содержащий выходные значения сети.
  • indexOf(Math.max(...)) позволяет определить класс с максимальной вероятностью.

Настройка параметров и регуляризация

Регуляризация и предотвращение переобучения:

  • Dropout — случайное отключение нейронов в обучении.
  • L2 decay — штраф за большие веса.
  • Data augmentation — генерация вариаций входных изображений (сдвиги, вращения, масштабирование).

Пример Dropout в полносвязном слое:

{type:'fc', num_neurons:128, activation:'relu', dropout:0.5}

Ускорение сходимости:

  • Использование нормализации входных данных.
  • Выбор правильного размера learning_rate.
  • Мониторинг loss и accuracy на контрольной выборке.

Советы по архитектуре

  • Для изображений 28×28: 2–3 сверточных слоя с pool, затем 1–2 полносвязных слоя, softmax на выходе.
  • Для табличных данных: несколько полносвязных слоев с активацией relu, optional dropout.
  • Количество фильтров в сверточных слоях растет по мере глубины сети, например 8 → 16 → 32.
  • Малые размеры фильтров (3×3, 5×5) дают более точные и детализированные признаки.

Инструменты отладки

  • net.getParamsAndGrads() — получение всех весов и градиентов.
  • net.toJSON() / net.fromJSON(json) — сохранение и восстановление сети.
  • Визуализация фильтров и карты активаций помогает понять, какие признаки захватывает сеть.

Многоклассовая классификация

ConvNetJS позволяет строить классификаторы на любое количество классов через слой softmax:

{type:'softmax', num_classes:10}
  • Каждая нейронная активация соответствует вероятности класса.
  • Используется функция потерь cross-entropy, которая автоматически считается в trainer.train.

Итоговая структура типичного классификатора

  1. Input layer: размер входа.
  2. Conv + ReLU → Pool (повторяется 2–3 раза).
  3. Fully connected + ReLU.
  4. Dropout (по необходимости).
  5. Softmax на выходе.
  6. Trainer с SGD, Adam или Adadelta.

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