Реализация на ConvNetJS

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')));

Советы по производительности

  • Минимизировать размер Vol до необходимого, чтобы экономить память.
  • Использовать небольшие фильтры (3x3, 5x5) для глубоких сетей.
  • Настраивать learning_rate с учетом размера батча.
  • Использовать ReLU для ускорения сходимости.
  • Для больших наборов данных лучше использовать мини-батчи, чтобы избегать переполнения памяти.

Расширенные возможности

ConvNetJS поддерживает:

  • Dropout — случайное зануление нейронов для регуляризации.
  • LRN — локальную нормализацию откликов для сверточных слоев.
  • Параллельное обучение на нескольких мини-батчах (BatchTrainer).

Эти функции позволяют строить более устойчивые и сложные модели для компьютерного зрения и других задач распознавания.