Обучение на изображениях

ConvNetJS — это полностью клиентская библиотека для создания, обучения и тестирования нейронных сетей на языке JavaScript. Она реализует как полносвязные сети (Fully Connected), так и свёрточные (Convolutional) сети, позволяя работать непосредственно в браузере без серверной инфраструктуры. Основное преимущество заключается в интерактивном обучении и визуализации процесса.

В ConvNetJS нейронная сеть строится как последовательность слоев (layers). Каждый слой принимает входные данные, выполняет вычисления и передаёт результат следующему слою. Для работы с изображениями критически важны следующие типы слоев:

  • InputLayer — начальный слой, определяет размеры входного изображения (ширина, высота, глубина).
  • ConvLayer — свёрточный слой, извлекает признаки, применяя фильтры (kernels) по всему изображению.
  • PoolLayer — слой подвыборки, уменьшающий размерность и выделяющий наиболее выраженные признаки.
  • ReluLayer / SigmoidLayer / TanhLayer — слои активации, вводящие нелинейность.
  • FullyConnectedLayer — полносвязный слой для интеграции признаков и подготовки к классификации.
  • SoftmaxLayer — слой для многоклассовой классификации, выдаёт вероятности принадлежности к каждому классу.

Настройка свёрточной сети

Конфигурация сети задаётся через объект net = new convnetjs.Net(), после чего с помощью net.makeLayers(layers) создаётся последовательность слоев. Например, свёрточная сеть для изображений 32x32x3 может быть описана так:

var layers = [];
layers.push({type:'input', width:32, height:32, depth:3});
layers.push({type:'conv', filters:16, size:3, stride:1, pad:1, activation:'relu'});
layers.push({type:'pool', pool:2, stride:2});
layers.push({type:'conv', filters:32, size:3, stride:1, pad:1, activation:'relu'});
layers.push({type:'pool', pool:2, stride:2});
layers.push({type:'fc', num_neurons:64, activation:'relu'});
layers.push({type:'softmax', num_classes:10});
net.makeLayers(layers);

Ключевые параметры свёрточного слоя:

  • filters — количество фильтров, определяющих, сколько признаков извлекается.
  • size — размер фильтра, обычно 3x3 или 5x5.
  • stride — шаг смещения фильтра при проходе по изображению.
  • pad — количество пикселей для дополнения границ изображения (zero-padding).

Обучение сети

Обучение сети происходит через оптимизатор Trainer, который принимает параметры скорости обучения (learning_rate), типа градиентного спуска и регуляризации:

var trainer = new convnetjs.Trainer(net, {
    method: 'sgd',
    learning_rate: 0.01,
    momentum: 0.9,
    batch_size: 20,
    l2_decay: 0.001
});

Процесс обучения:

  1. Преобразование изображения в формат Vol (ConvNetJS объект для данных с глубиной).
  2. Вызов метода trainer.train(x, y), где x — входной Vol, а y — правильная метка класса.
  3. Сеть обновляет веса и смещения через обратное распространение ошибки (backpropagation).

Для эффективного обучения на изображениях рекомендуется:

  • Нормализация входных данных: масштабирование пикселей до диапазона [0,1] или [-1,1].
  • Аугментация данных: повороты, отражения, сдвиги для увеличения объёма тренировочного набора.
  • Регуляризация: L2-декей и Dropout для предотвращения переобучения.

Инференс и оценка качества

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

var x = new convnetjs.Vol(imageWidth, imageHeight, imageDepth);
var probabilities = net.forward(x);
var predictedClass = probabilities.w.indexOf(Math.max(...probabilities.w));

Важные моменты при оценке:

  • Метод forward не изменяет веса, только вычисляет выход.
  • Для многоклассовой классификации используется Softmax, который гарантирует, что сумма всех вероятностей равна 1.
  • Метрики точности (accuracy) и среднеквадратичная ошибка (MSE) помогают контролировать прогресс обучения.

Работа с изображениями разных размеров

ConvNetJS требует явного задания размеров входного изображения. Для изображений различных размеров применяются:

  • Resize до фиксированного размера, чтобы сеть всегда получала одинаковый вход.
  • Padding для сохранения пропорций без искажения.
  • Глобальная подвыборка (Global Pooling) для агрегации признаков перед полносвязными слоями.

Визуализация весов и признаков

ConvNetJS позволяет визуализировать обученные фильтры свёрточных слоев, что помогает понять, какие признаки сеть научилась распознавать. Например, фильтры первого слоя часто выявляют границы и углы, а последующие слои — сложные текстуры и комбинации признаков.

var convLayer = net.layers[1]; // первый свёрточный слой
for(var i=0;i

Оптимизация и производительность

Работа с изображениями в браузере накладывает ограничения по памяти и скорости. Рекомендуется:

  • Использовать малые размеры фильтров и слоев на первых этапах.
  • Минимизировать глубину сети для небольших задач.
  • Применять пакетную обработку (batch processing) для ускорения обучения.

Объёмные сети можно тестировать постепенно, увеличивая сложность и количество фильтров после отладки базовой модели.