LeNet

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

ConvNetJS использует объект Vol для представления многомерных тензоров. Этот объект является основой для передачи данных через слои сети. Каждый слой в ConvNetJS имеет методы forward() и backward(), реализующие прямое и обратное распространение соответственно.


Архитектура LeNet в ConvNetJS

LeNet — это классическая сверточная нейронная сеть, разработанная для распознавания рукописных цифр (MNIST). Она состоит из чередующихся сверточных и субдискретизирующих слоев, за которыми следуют полносвязные слои. В ConvNetJS LeNet можно реализовать через комбинацию следующих слоев:

  • conv — сверточный слой;
  • relu — слой нелинейной активации ReLU (или sigmoid для классического LeNet);
  • pool — слой подвыборки (max-pooling или average-pooling);
  • fc — полносвязный слой;
  • softmax — слой для классификации с вероятностным распределением.

Пример структуры LeNet:

  1. Входной слой: изображение 28x28 (MNIST).
  2. Conv1: 6 фильтров 5x5, stride=1, padding=0.
  3. Sigmoid/Relu: нелинейная активация.
  4. Pool1: subsampling 2x2 (stride=2).
  5. Conv2: 16 фильтров 5x5.
  6. Sigmoid/Relu.
  7. Pool2: subsampling 2x2.
  8. FC1: 120 нейронов.
  9. FC2: 84 нейрона.
  10. Softmax: выход 10 классов (цифры 0–9).

Каждый слой передает данные в следующий через объект Vol, который хранит значения и градиенты.


Создание сети в ConvNetJS

ConvNetJS использует объект Net для создания сети. Слои добавляются с помощью метода addLayer(), а параметры слоев задаются через объект конфигурации.

Пример конфигурации сверточного слоя:

{
    type: 'conv',
    sx: 5, // размер фильтра
    filters: 6, // количество фильтров
    stride: 1,
    pad: 0,
    activation: 'sigmoid' // или 'relu'
}

Слой подвыборки (pooling):

{
    type: 'pool',
    sx: 2, // размер окна
    stride: 2
}

Полносвязный слой (fully connected):

{
    type: 'fc',
    num_neurons: 120,
    activation: 'sigmoid'
}

Слой классификации Softmax:

{
    type: 'softmax',
    num_classes: 10
}

Сеть собирается последовательно, а для обучения используется объект Trainer, который позволяет настраивать скорость обучения, метод оптимизации и регуляризацию.


Прямое и обратное распространение

В ConvNetJS forward pass вычисляет активации каждого слоя. Для сверточного слоя это означает применение фильтров к входному тензору, суммирование и добавление смещения:

[ y = (x * w) + b]

где x — входной Vol, w — ядра свертки, b — смещение.

Обратное распространение (backward pass) вычисляет градиенты по весам и входным данным. ConvNetJS реализует это для каждого слоя, аккумулируя градиенты в Vol.dw и layer.filters.dw. Эти значения затем используются оптимизатором для обновления весов.


Настройка тренера

Trainer управляет процессом обучения сети:

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

Пример обучения сети на MNIST

  1. Загрузка и нормализация данных.
  2. Создание объекта сети и добавление слоев LeNet.
  3. Инициализация тренера.
  4. Итеративная подача входов и вызов trainer.train(x, y).

ConvNetJS позволяет отслеживать прогресс через loss и точность на тестовой выборке. Для ускорения обучения можно использовать GPU-ускорители, если библиотека запущена в Node.js с поддержкой WebGL.


Особенности ConvNetJS

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