ConvNetJS — это полностью клиентская библиотека для построения, обучения и тестирования нейронных сетей в браузере на JavaScript. Она реализует как полносвязные сети (Fully Connected / Dense), так и сверточные сети (Convolutional Neural Networks, CNN). Основная идея заключается в представлении нейронной сети как последовательности слоев, каждый из которых выполняет трансформацию входных данных и передает результат следующему.
Каждый слой в ConvNetJS характеризуется набором параметров: размерность входа, количество нейронов или фильтров, функции активации и параметры регуляризации. Для сверточных слоев важны размер фильтра, шаг свертки (stride) и паддинг (padding), которые определяют пространственное уменьшение и сохранение информации о границах изображения.
В ConvNetJS нейронная сеть строится как объект Net, к
которому последовательно добавляются слои:
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:'softmax', num_classes:10}
]);
input — слой входных данных. Параметры
out_sx, out_sy и out_depth задают
размеры входного объема.conv — сверточный слой.
sx — размер фильтра, filters — количество
фильтров.pool — слой подвыборки (subsampling),
уменьшает пространственные размеры с сохранением наиболее значимых
признаков.softmax — выходной слой для
классификации с вероятностной интерпретацией.Каждый слой возвращает объект Vol (volume), содержащий
данные и градиенты для обратного распространения ошибки.
Прямое распространение (forward pass) вычисляет выход сети на основе входных данных:
var x = new convnetjs.Vol(28, 28, 1); // создаем входной объем
var prob = net.forward(x); // получаем выход сети
Результат prob — это массив вероятностей классов. Для
сверточных сетей каждый элемент Vol содержит значения
активаций после применения фильтров и функций активации.
Обратное распространение (backward pass) используется для вычисления градиентов и обновления весов:
var trainer = new convnetjs.SGDTrainer(net, {learning_rate:0.01, momentum:0.9, batch_size:10});
trainer.train(x, y); // y — истинный класс
Объект trainer управляет процедурой обучения, учитывая
параметры: скорость обучения (learning_rate), моментум
(momentum) и размер пакета (batch_size).
ConvNetJS поддерживает различные функции активации
(relu, sigmoid, tanh) и
метрики потерь (softmax,
squared loss). Важные аспекты при построении сети:
ConvNetJS использует объекты Vol, которые представляют
данные в виде трёхмерных тензоров (width × height × depth).
Сверточные операции выполняются по этим объемам:
Эти операции позволяют сети выявлять локальные паттерны, например, края и текстуры на изображениях, что делает ConvNetJS эффективным инструментом для распознавания визуальной информации.
ConvNetJS полностью реализован на JavaScript и не требует серверной поддержки. Прямое использование в браузере позволяет:
Однако при больших сетях производительность ограничена CPU браузера. Для ускорения можно уменьшить размер слоев или использовать меньшие пакеты данных. Для экспериментальной работы с реальными изображениями размером 28×28–64×64 этого достаточно.
ConvNetJS поддерживает два основных режима работы:
Этот режим разделения позволяет одновременно исследовать эффективность архитектур и проводить реальную классификацию без перерасчета градиентов.
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}
]);
var trainer = new convnetjs.SGDTrainer(net, {learning_rate:0.01, momentum:0.9, batch_size:20});
Сеть способна классифицировать изображения рукописных цифр MNIST, выявляя границы и контуры на ранних слоях, а комбинации признаков на более глубоких слоях позволяют различать цифры между собой.