ConvNetJS — это чисто JavaScript-библиотека для построения и обучения сверточных нейронных сетей (Convolutional Neural Networks, CNN) прямо в браузере или на сервере через Node.js. Она позволяет создавать нейронные сети с различными типами слоев, включая свертки, пулинг, полносвязные слои и слои активации, и обучать их с использованием стохастического градиентного спуска.
ConvNetJS использует объект Vol для
представления многомерных тензоров. Этот объект является основой для
передачи данных через слои сети. Каждый слой в ConvNetJS имеет методы
forward() и
backward(), реализующие прямое и обратное
распространение соответственно.
LeNet — это классическая сверточная нейронная сеть, разработанная для распознавания рукописных цифр (MNIST). Она состоит из чередующихся сверточных и субдискретизирующих слоев, за которыми следуют полносвязные слои. В ConvNetJS LeNet можно реализовать через комбинацию следующих слоев:
conv — сверточный слой;relu — слой нелинейной активации ReLU
(или sigmoid для классического LeNet);pool — слой подвыборки (max-pooling
или average-pooling);fc — полносвязный слой;softmax — слой для классификации с
вероятностным распределением.Пример структуры LeNet:
Каждый слой передает данные в следующий через объект
Vol, который хранит значения и
градиенты.
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 — размер мини-батча.trainer.train(x, y).ConvNetJS позволяет отслеживать прогресс через loss и
точность на тестовой выборке. Для ускорения обучения можно использовать
GPU-ускорители, если библиотека запущена в Node.js с поддержкой
WebGL.
sigmoid,
tanh, relu.