Что такое ConvNetJS

ConvNetJS — это чисто клиентская библиотека для построения и обучения нейронных сетей, полностью написанная на JavaScript. Она поддерживает как обучение многослойных перцептронов (MLP), так и свёрточных нейронных сетей (CNN), что делает её удобной для экспериментов с моделями прямо в браузере без необходимости установки сложного ПО.

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


Структура данных

В ConvNetJS основные сущности:

  • Vol — многомерный массив данных, который используется для хранения входов, весов, градиентов и активаций. Каждый Vol имеет размеры (width, height, depth) и содержит flattened массив значений, что обеспечивает удобную работу с матрицами и тензорами.

  • Net — объект нейронной сети. Содержит список слоёв и методы для прямого распространения (forward) и обратного распространения ошибки (backward).

  • Layer — базовый блок сети. Каждый слой имеет тип (fc, conv, pool, softmax, relu и др.), параметры и внутренние веса.

Пример создания Vol:

var input = new convnetjs.Vol(32, 32, 3); // изображение 32x32 с 3 каналами (RGB)
input.set(0.5); // заполняем все значения 0.5

Типы слоёв

Полносвязный слой (Fully-Connected, fc)

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

Параметры:

  • num_neurons — количество нейронов.
  • activation — функция активации (relu, sigmoid, tanh).

Пример:

var layer_fc = { type: 'fc', num_neurons: 100, activation: 'relu' };
net.addLayer(layer_fc);

Свёрточный слой (conv)

Свёрточные слои применяют фильтры к входным данным, выделяя локальные признаки. Важные параметры:

  • filter_size — размер ядра свёртки.
  • num_filters — количество фильтров.
  • stride — шаг сканирования фильтра.
  • pad — добавление нулей вокруг границ для сохранения размеров.

Пример:

var layer_conv = { type: 'conv', filter_size: 5, num_filters: 16, stride: 1, pad: 2, activation: 'relu' };
net.addLayer(layer_conv);

Подвыборка (Pooling, pool)

Pooling уменьшает размерность данных и увеличивает устойчивость к сдвигам. Чаще всего используется max pooling.

Параметры:

  • pool_size — размер окна.
  • stride — шаг.
var layer_pool = { type: 'pool', pool_size: 2, stride: 2 };
net.addLayer(layer_pool);

Функции активации

ConvNetJS включает несколько функций активации:

  • relu — обнуляет отрицательные значения.
  • sigmoid — сглаживает значения между 0 и 1.
  • tanh — значения между -1 и 1.
  • softmax — нормализует выходные данные в вероятности.

Активация задаётся при создании слоя и влияет на прямое и обратное распространение.


Обучение сети

Для обучения используется стохастический градиентный спуск (SGD) и его модификации. Основные шаги:

  1. Forward pass — вычисление выходов слоёв на основе входных данных.
  2. Compute loss — расчёт функции потерь (softmax для классификации, squared error для регрессии).
  3. Backward pass — обратное распространение ошибки и обновление градиентов.
  4. Update weights — применение алгоритма оптимизации.

Пример обучения:

var trainer = new convnetjs.SGDTrainer(net, {
    learning_rate: 0.01,
    momentum: 0.9,
    batch_size: 10,
    l2_decay: 0.001
});

trainer.train(input, label); // input — Vol, label — индекс класса

Особенности работы в браузере

ConvNetJS оптимизирован для работы на CPU. Она не использует GPU, что делает её медленнее для больших сетей, но идеально подходит для:

  • интерактивных демо,
  • учебных экспериментов,
  • отладки архитектур нейронных сетей без серверной части.

Сети можно хранить и загружать через JSON, что упрощает сохранение состояния между сессиями:

var json = net.toJSON();
var net2 = new convnetjs.Net();
net2.fromJSON(json);

Визуализация и отладка

ConvNetJS предоставляет встроенные функции для визуализации:

  • фильтров свёрточных слоёв,
  • распределения активаций,
  • графиков потерь во время обучения.

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


Преимущества и ограничения

Преимущества:

  • Простота и легковесность.
  • Работа полностью в браузере.
  • Поддержка базовых типов слоёв CNN и MLP.
  • Удобство визуализации и сохранения моделей.

Ограничения:

  • Нет поддержки GPU, ограниченная скорость при больших сетях.
  • Подходит больше для обучения на небольших датасетах.
  • Ограниченный набор функций по сравнению с TensorFlow.js или PyTorch.js.