Построение энкодера

ConvNetJS — это библиотека на JavaScript для построения и обучения нейронных сетей, включая сверточные, полностью связанные и рекуррентные сети. Она предоставляет удобный API для создания сетевых слоёв, управления их параметрами, обучения на данных и получения прогнозов. Сеть в ConvNetJS строится как последовательность слоёв (Layer), где каждый слой выполняет преобразование входных данных и передаёт результат следующему слою.

Каждый слой имеет собственные параметры: веса, смещения и функции активации. Эти параметры обновляются в процессе обратного распространения ошибки (backpropagation) с использованием выбранного оптимизатора. ConvNetJS поддерживает различные типы слоёв:

  • input — слой для подачи данных в сеть.
  • conv — сверточный слой, извлекающий локальные признаки.
  • pool — слой подвыборки (subsampling) для уменьшения размерности.
  • fc — полностью связанный слой.
  • relu, sigmoid, tanh — слои активации.
  • softmax — слой классификации.

Построение энкодера

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

Пример структуры энкодера:

  1. Слой ввода
var layer_input = {type:'input', out_sx:28, out_sy:28, out_depth:1};
  • out_sx и out_sy — размеры входного изображения.
  • out_depth — количество каналов (например, 1 для чёрно-белого изображения).
  1. Первый сверточный слой
var layer_conv1 = {type:'conv', sx:5, filters:8, stride:1, pad:2, activation:'relu'};
  • sx — размер фильтра (ядра свёртки).
  • filters — количество фильтров, определяющих глубину выхода.
  • stride — шаг свёртки.
  • pad — добавление нулей по краям.
  • activation — функция активации.
  1. Слой подвыборки (Pooling)
var layer_pool1 = {type:'pool', sx:2, stride:2};
  • Уменьшает размеры карты признаков в 2 раза, сохраняя максимальные значения.
  1. Второй сверточный слой
var layer_conv2 = {type:'conv', sx:5, filters:16, stride:1, pad:2, activation:'relu'};
  • Увеличивает глубину признаков для более сложного описания входа.
  1. Второй слой подвыборки
var layer_pool2 = {type:'pool', sx:2, stride:2};
  1. Полностью связанный слой
var layer_fc = {type:'fc', num_neurons:64, activation:'relu'};
  • Сжимает пространственно-развёрнутую карту признаков в компактный вектор размерности 64.

Преобразование данных и прямой проход

После определения слоёв создаётся объект сети:

var net = new convnetjs.Net();
net.makeLayers([
  layer_input,
  layer_conv1,
  layer_pool1,
  layer_conv2,
  layer_pool2,
  layer_fc
]);
  • makeLayers принимает массив объектов слоёв и автоматически формирует структуру сети.
  • Для передачи данных используется объект Vol (volume):
var x = new convnetjs.Vol(28,28,1,0.0);
  • Vol хранит значения входного изображения и промежуточные активации.
  • Прямой проход:
var output = net.forward(x);
  • Возвращает результат работы сети на данном входе, который может быть скрытым представлением (кодом энкодера) или прогнозом для классификации.

Обратное распространение ошибки

Обратное распространение в ConvNetJS позволяет обновлять веса слоёв, минимизируя функцию потерь:

var trainer = new convnetjs.SGDTrainer(net, {learning_rate:0.01, momentum:0.9, batch_size:10});
var loss = trainer.train(x, y); // y — целевой вектор
  • SGDTrainer реализует стохастический градиентный спуск с моментумом.
  • Для энкодеров в задачах сжатия часто используется функция потерь MSE (Mean Squared Error) между входом и реконструированным выходом.

Тонкости построения энкодера

  • Размер ядра и stride: выбираются так, чтобы постепенно уменьшать размеры изображения, но не терять критические признаки.
  • Количество фильтров: с увеличением глубины сети фильтров обычно становится больше, чтобы захватывать более сложные признаки.
  • Функции активации: ReLU является стандартом для свёрточных и полностью связанных слоёв; для кодового вектора можно использовать tanh или sigmoid, если требуется ограничение значений.
  • Pooling vs. strided convolution: пуллинг уменьшает размерность более явно, но strided convolution иногда предпочтительнее для плотных энкодеров.
  • Инициализация весов: ConvNetJS использует случайную инициализацию, но для сложных задач можно вручную контролировать диапазоны значений.

Использование кодового представления

После обучения энкодера компактный вектор из последнего полностью связанного слоя (layer_fc) может служить:

  • Для восстановления изображения через декодер.
  • В качестве признакового описания для классификации или кластеризации.
  • Для визуализации признакового пространства с использованием методов типа t-SNE.

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