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.Net. Его
конфигурация описывается массивом слоев, где каждый слой задается
объектом с типом и параметрами.
Пример простейшей сети для классификации изображений 28x28 пикселей:
let layer_defs = [];
layer_defs.push({type:'input', out_sx:28, out_sy:28, out_depth:1});
layer_defs.push({type:'conv', sx:5, filters:8, stride:1, pad:2, activation:'relu'});
layer_defs.push({type:'pool', sx:2, stride:2});
layer_defs.push({type:'fc', num_neurons:10, activation:'softmax'});
let net = new convnetjs.Net();
net.makeLayers(layer_defs);
Ключевые моменты:
input — входной слой, задает размерность данных.conv — сверточный слой, sx — размер ядра,
filters — количество фильтров, stride и
pad регулируют сдвиг и заполнение.pool — слой подвыборки, уменьшает размерность карты
признаков.fc — полносвязный слой, часто используется перед
выходным слоем.activation — функция активации (relu,
sigmoid, tanh, softmax).Для обучения используется объект ConvNetJS.Trainer,
который принимает сеть и параметры обучения:
let trainer = new convnetjs.Trainer(net, {
method: 'sgd',
learning_rate: 0.01,
l2_decay: 0.001,
batch_size: 20
});
Пояснения параметров:
method — алгоритм оптимизации (sgd,
adagrad, adadelta, adam).learning_rate — скорость обучения.l2_decay — коэффициент регуляризации для предотвращения
переобучения.batch_size — размер мини-батча.ConvNetJS работает с объектами Vol, которые представляют
собой многомерные массивы данных. Для создания из обычного массива
используется:
let x = new convnetjs.Vol([0,1,2,3,4,5,6,7,8]);
Для изображений размерностью 28x28:
let imageArray = new Array(28*28).fill(0); // заполнение нулями
let inputVol = new convnetjs.Vol(imageArray);
Обучение проводится через вызов train у объекта
Trainer:
trainer.train(inputVol, 3); // 3 — номер класса
Для нескольких эпох и батчей можно организовать цикл:
for (let i = 0; i < 1000; i++) {
let x = new convnetjs.Vol(getNextImageData());
let y = getNextLabel();
trainer.train(x, y);
}
После обучения можно получать предсказания через метод
forward:
let output = net.forward(inputVol);
let predictedClass = output.w.indexOf(Math.max(...output.w));
output.w — массив вероятностей по классам.indexOf(Math.max(...)) — определение класса с
наибольшей вероятностью.Для оценки точности используется подсчет совпадений с эталонными метками:
let correct = 0;
for (let i = 0; i < testData.length; i++) {
let x = new convnetjs.Vol(testData[i].image);
let y = testData[i].label;
let output = net.forward(x);
let pred = output.w.indexOf(Math.max(...output.w));
if(pred === y) correct++;
}
let accuracy = correct / testData.length;
Сеть можно сериализовать в JSON для хранения или передачи:
let json = net.toJSON();
let jsonString = JSON.stringify(json);
Для восстановления сети:
let net2 = new convnetjs.Net();
net2.fromJSON(JSON.parse(jsonString));
Интеграция с PWA позволяет создавать автономные ML-приложения, работающие без подключения к серверу. Основные шаги:
Пример кэширования модели в IndexedDB:
async function saveModel(id, model) {
const db = await indexedDB.open('ml-db', 1);
db.onupgradenee ded = () => db.result.createObjectStore('models');
db.result.transaction('models', 'readwrite').objectStore('models').put(model, id);
}
async function loadModel(id) {
const db = await indexedDB.open('ml-db', 1);
return new Promise(resolve => {
db.result.transaction('models').objectStore('models').get(id).onsucc ess = e => resolve(e.target.result);
});
}
Использование таких подходов позволяет PWA с ML работать полностью автономно, обеспечивая мгновенный отклик на действия пользователя без сетевых задержек.
ConvNetJS включает встроенные инструменты для визуализации карт признаков, весов и ошибок обучения. Пример интеграции с Canvas:
function drawFilters(ctx, net) {
let convLayer = net.layers[1]; // первый сверточный слой
convLayer.filters.forEach((filt, i) => {
let img = filt.w.map(v => Math.floor((v+1)*128));
// визуализация на canvas
// ...
});
}
Это позволяет наблюдать динамику обучения и выявлять проблемы на раннем этапе.
batch_size > 1 ускоряет обучение за
счет пакетной обработки.l2_decay помогает сохранить обучаемость при
больших данных.ConvNetJS подходит для экспериментальных и образовательных проектов, позволяет легко создавать интерактивные нейронные сети, визуализировать их работу и полностью интегрировать в современную архитектуру PWA.