ConvNetJS — это чисто JavaScript-библиотека для построения и обучения
сверточных нейронных сетей прямо в браузере или на Node.js. Для работы в
браузере достаточно подключить библиотеку через
<script>:
<script src="https://cs.stanford.edu/people/karpathy/convnetjs/build/convnet-min.js"></script>
Для Node.js библиотека доступна через npm:
npm install convnetjs
После установки можно импортировать её в проект:
const convnetjs = require('convnetjs');
ConvNetJS использует несколько ключевых структур:
Vol — основной объект для хранения многомерных данных (тензоров), включая веса и входные данные.
let x = new convnetjs.Vol(3, 3, 1); // 3x3 изображение с 1 каналом
Ключевые методы Vol: get(x, y, d),
set(x, y, d, val), clone(),
addFrom(vol).
Net — объект сети. Содержит слои и методы для обучения и прогнозирования.
let net = new convnetjs.Net();Trainer — управляет процессом обучения сети, реализует алгоритмы обратного распространения.
let trainer = new convnetjs.SGDTrainer(net, {learning_rate: 0.01, momentum: 0.9});Сеть строится из последовательных слоев, описанных через конфигурационные объекты. Библиотека поддерживает следующие типы слоев:
InputLayer — входной слой, определяет размер входного тензора.
{type:'input', out_sx:32, out_sy:32, out_depth:3}ConvLayer — сверточный слой.
{
type:'conv',
sx:5, // размер фильтра
filters:16, // количество фильтров
stride:1,
pad:2,
activation:'relu'
}PoolLayer — слой подвыборки (пулинга), уменьшает размер карты признаков.
{type:'pool', sx:2, stride:2}FullyConnLayer — полностью связанный слой.
{type:'fc', num_neurons:100, activation:'relu'}SoftmaxLayer — выходной слой для классификации.
{type:'softmax', num_classes:10}Архитектура задается массивом конфигураций:
net.makeLayers([
{type:'input', out_sx:32, out_sy:32, out_depth:3},
{type:'conv', sx:5, filters:16, stride:1, pad:2, activation:'relu'},
{type:'pool', sx:2, stride:2},
{type:'fc', num_neurons:100, activation:'relu'},
{type:'softmax', num_classes:10}
]);
Данные для ConvNetJS должны быть представлены в виде объектов Vol или массивов, которые можно преобразовать в Vol:
let imgData = [0,0,0,1,1,1,...]; // одномерный массив пикселей
let inputVol = new convnetjs.Vol(32, 32, 3);
inputVol.setFromArray(imgData);
Для обучения с классификацией необходимы соответствующие метки классов:
let labels = [0, 1, 2, 3, ...]; // классы изображений
Trainer реализует стохастический градиентный спуск (SGD) и поддерживает различные параметры:
learning_rate — скорость обучения.momentum — моментум для сглаживания обновлений.batch_size — размер мини-батча.l2_decay — коэффициент L2-регуляризации.Пример инициализации:
let trainer = new convnetjs.SGDTrainer(net, {
learning_rate:0.01,
momentum:0.9,
batch_size:20,
l2_decay:0.001
});
Обучение выполняется через метод train, принимающий
входной Vol и правильную метку класса:
trainer.train(inputVol, trueLabel);
Для множественных итераций можно использовать цикл:
for(let i=0;i<1000;i++){
let x = new convnetjs.Vol(32,32,3);
x.setFromArray(getImageData(i));
let y = getLabel(i);
trainer.train(x, y);
}
После обучения сеть можно использовать для предсказаний с помощью
метода forward:
let x = new convnetjs.Vol(32,32,3);
x.setFromArray(testData);
let output = net.forward(x);
let predictedClass = output.w.indexOf(Math.max(...output.w));
output.w возвращает массив вероятностей для каждого
класса. Индекс максимальной вероятности соответствует прогнозируемому
классу.
ConvNetJS позволяет сериализовать сеть в JSON:
let json = net.toJSON();
localStorage.setItem('myConvNet', JSON.stringify(json));
Для восстановления:
let net2 = new convnetjs.Net();
net2.fromJSON(JSON.parse(localStorage.getItem('myConvNet')));
ReLU для ускорения сходимости.ConvNetJS поддерживает:
Эти функции позволяют строить более устойчивые и сложные модели для компьютерного зрения и других задач распознавания.