ConvNetJS — это чисто JavaScript-библиотека для создания и обучения нейронных сетей, включая сверточные сети (CNN) и полносвязные многослойные перцептроны (MLP). Она ориентирована на работу прямо в браузере, без необходимости установки серверных компонентов, что позволяет экспериментировать с нейронными сетями в интерактивной среде.
Все сети в ConvNetJS строятся на основе объектов Vol,
которые представляют собой многомерные массивы данных, аналогичные
тензорам в других библиотеках. Эти объекты используются для хранения
входных данных, промежуточных активаций и градиентов при обратном
распространении ошибки.
Декодер — это структура, предназначенная для преобразования скрытых представлений нейронной сети обратно в форму, близкую к исходным данным. В задачах автокодирования (autoencoder) и генеративных сетях декодер играет ключевую роль.
Типичный декодер в ConvNetJS строится из следующих компонентов:
Полносвязные слои (Fully Connected,
fc) Полносвязный слой преобразует входной вектор
скрытых признаков в представление, пригодное для дальнейшей
реконструкции.
var layer_fc = { type: 'fc', num_neurons: 128, activation: 'relu' };
Ключевой момент: выбор количества нейронов в слое декодера должен соответствовать размерности выходного тензора, которую необходимо восстановить.
Сверточные и транспонированные сверточные слои (Conv /
Deconv) Для изображений часто используют сверточные декодеры,
где применяются транспонированные сверточные слои (deconv),
которые увеличивают пространственные размеры активаций.
var layer_deconv = { type: 'deconv', sx: 5, filters: 16, stride: 2, activation: 'relu' };
Особенности:
sx — размер ядра фильтра.filters — количество выходных каналов.stride — коэффициент увеличения пространственного
разрешения.Финальный слой реконструкции Обычно используется
линейная активация (identity) для непрерывных данных или
sigmoid для нормализованных изображений (значения 0–1).
var layer_output = { type: 'fc', num_neurons: output_dim, activation: 'sigmoid' };Пример построения простого декодера для автокодера:
var net = new convnetjs.Net();
net.makeLayers([
{ type: 'input', out_sx: 1, out_sy: 1, out_depth: 64 },
{ type: 'fc', num_neurons: 128, activation: 'relu' },
{ type: 'fc', num_neurons: 256, activation: 'relu' },
{ type: 'fc', num_neurons: 784, activation: 'sigmoid' } // для восстановления изображения 28x28
]);
Ключевой момент: размерность последнего слоя должна точно совпадать с размерностью исходных данных.
Для передачи данных используется объект Vol. Входной
вектор скрытого представления создается через:
var x = new convnetjs.Vol(hidden_vector);
var output = net.forward(x);
Здесь:
hidden_vector — массив с размерностью, соответствующей
входному слою декодера.output — объект Vol, содержащий
реконструированные значения.Обучение осуществляется стандартными методами ConvNetJS с помощью
Trainer:
var trainer = new convnetjs.SGDTrainer(net, { learning_rate: 0.01, momentum: 0.9, batch_size: 10 });
for (var i = 0; i < data.length; i++) {
var x = new convnetjs.Vol(encoded_data[i]);
var y = new convnetjs.Vol(original_data[i]);
trainer.train(x, y);
}
Особенности:
learning_rate и momentum критичны для
стабильного обучения.batch_size) ускоряет
обучение и уменьшает дисперсию градиентов.relu или tanh. Для выхода — активация должна
соответствовать диапазону исходных данных.