ConvNetJS — это библиотека для создания и обучения сверточных нейронных сетей прямо в браузере на JavaScript. Она предоставляет мощный набор инструментов для обработки изображений, распознавания объектов и других задач машинного обучения без необходимости серверной инфраструктуры. Интеграция с браузерными средствами позволяет создавать интерактивные веб-приложения с нейронными сетями, используя стандартные возможности DOM, Canvas и событий браузера.
Для начала работы с ConvNetJS в браузере достаточно подключить скрипт в HTML-документе:
<script src="https://cs.stanford.edu/people/karpathy/convnetjs/build/convnet-min.js"></script>
После этого все объекты библиотеки становятся доступны глобально, включая ConvNetJS.Net, ConvNetJS.Vol, ConvNetJS.Trainer.
Создание сверточной сети начинается с описания её структуры через JSON-конфигурацию:
var layer_defs = [];
layer_defs.push({type:'input', out_sx:32, out_sy:32, out_depth:3});
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:64, activation:'relu'});
layer_defs.push({type:'softmax', num_classes:10});
var net = new ConvNetJS.Net();
net.makeLayers(layer_defs);
Ключевые моменты:
out_sx, out_sy, out_depth
задают размеры входного тензора.sx и stride в сверточных слоях определяют
размер фильтра и шаг свертки.pool слой уменьшает пространственные размеры через
подвыборку.fc слой — полносвязный, объединяет все признаки в один
вектор для классификации.Для работы с изображениями напрямую в браузере можно использовать
<canvas>:
var canvas = document.getElementById('myCanvas');
var ctx = canvas.getContext('2d');
canvas.addEventListener('mousemove', function(e){
if(e.buttons === 1){
ctx.fillStyle = 'black';
ctx.fillRect(e.offsetX, e.offsetY, 5, 5);
}
});
Созданное изображение можно затем преобразовать в Vol для подачи в сеть:
function getInputVol() {
var imgData = ctx.getImageData(0, 0, canvas.width, canvas.height);
var vol = new ConvNetJS.Vol(canvas.width, canvas.height, 3, 0.0);
for(var y=0;y<canvas.height;y++){
for(var x=0;x<canvas.width;x++){
var i = (y*canvas.width + x)*4;
vol.set(x, y, 0, imgData.data[i]/255.0);
vol.set(x, y, 1, imgData.data[i+1]/255.0);
vol.set(x, y, 2, imgData.data[i+2]/255.0);
}
}
return vol;
}
Особенности:
[0, 1].net.forward(vol)).Для отладки полезно визуализировать активность слоёв:
function visualizeLayer(layer) {
var canvas = document.getElementById('layerCanvas');
var ctx = canvas.getContext('2d');
var data = layer.w;
var size = Math.sqrt(data.length);
var imageData = ctx.createImageData(size, size);
for(var i=0;i<data.length;i++){
var val = Math.floor(data[i] * 255);
imageData.data[i*4] = val;
imageData.data[i*4+1] = val;
imageData.data[i*4+2] = val;
imageData.data[i*4+3] = 255;
}
ctx.putImageData(imageData, 0, 0);
}
Такой подход позволяет отслеживать весовые коэффициенты и выходные активации на каждом шаге.
Обучение сети можно производить онлайн, используя Trainer:
var trainer = new ConvNetJS.Trainer(net, {method:'sgd', learning_rate:0.01, momentum:0.9, batch_size:5});
Процесс обучения происходит итеративно:
function trainStep(vol, label) {
var stats = trainer.train(vol, label);
console.log('loss:', stats.loss);
}
Особенности обучения в браузере:
ConvNetJS легко связывается с интерактивными элементами страницы:
document.getElementById('predictButton').addEventListener('click', function(){
var vol = getInputVol();
var output = net.forward(vol);
console.log('Prediction:', output.w.indexOf(Math.max(...output.w)));
});
Это позволяет реализовать интерфейсы типа “нарисуй цифру и узнай результат”, где обработка и предсказание происходят полностью на клиентской стороне.
Сети можно сохранять в JSON и загружать без сервера:
var json = net.toJSON();
var restoredNet = new ConvNetJS.Net();
restoredNet.fromJSON(json);
Это открывает возможности для локального сохранения прогресса обучения или передачи модели между пользователями.
Для снижения нагрузки на браузер:
requestAnimationFrame для визуализации и
интерактивных обновлений.batch_size)
вместо единовременной обработки больших данных.Эта интеграция позволяет создавать полноценные нейронные приложения в браузере, сочетая возможности ConvNetJS с интерактивными средствами веб-платформы. Взаимодействие с Canvas, DOM и событиями делает процесс обучения и предсказания на клиенте быстрым, наглядным и автономным.