ConvNetJS — это полностью клиентская библиотека для работы с нейронными сетями в JavaScript. Она поддерживает обучение и прогнозирование многослойных сетей, включая полносвязные и сверточные. Основной структурной единицей является слой (Layer), каждый из которых выполняет определённую функцию: свертку, подвыборку, активацию или нормализацию.
Сетки строятся из слоёв, где важна последовательность их применения: входные данные проходят через слой за слоем, при этом каждый слой может трансформировать данные, извлекая новые признаки и сокращая размерность.
Сжатие данных относится к методам уменьшения размерности входных данных без значительной потери информативности. В ConvNetJS это достигается через несколько механизмов:
MaxPoolingLayer и AvgPoolingLayer выполняют агрегацию признаков по локальным областям. Основная идея — уменьшить пространственные размеры карты признаков, сохранив наиболее важные значения:
var layer_def = {};
layer_def.type = 'pool';
layer_def.sx = 2; // ширина окна
layer_def.sy = 2; // высота окна
layer_def.stride = 2; // шаг
layer_def.pad = 0; // паддинг
net.addLayer(layer_def);
Сверточный слой не только извлекает признаки, но и уменьшает размер данных при использовании подходящих фильтров и шага свертки:
var layer_def = {};
layer_def.type = 'conv';
layer_def.sx = 5; // размер фильтра
layer_def.filters = 16; // количество фильтров
layer_def.stride = 1;
layer_def.pad = 2;
net.addLayer(layer_def);
FullyConnectedLayer принимает вход размерности
N и выводит меньшее число нейронов M (где M
< N), что фактически сжимает данные в компактное представление:
var layer_def = {};
layer_def.type = 'fc';
layer_def.num_neurons = 64; // меньше, чем вход
net.addLayer(layer_def);
Это используется для уменьшения объёма признаков перед классификацией.
Перед подачей данных в сеть их часто нужно векторизовать и нормализовать:
[0, 1] или [-1, 1], что ускоряет
сходимость и улучшает стабильность.ConvNetJS использует объекты Vol, представляющие данные как трёхмерные тензоры (ширина × высота × глубина), что позволяет эффективно выполнять свертку и подвыборку.
var x = new convnetjs.Vol(32, 32, 3); // 32x32 RGB изображение
Слой Dropout случайным образом отключает часть нейронов во время обучения, что уменьшает избыточность информации и улучшает обобщающую способность сети:
var layer_def = {};
layer_def.type = 'dropout';
layer_def.drop_prob = 0.5; // вероятность отключения
net.addLayer(layer_def);
Dropout не сжимает данные в прямом смысле, но способствует формированию компактных и устойчивых признаков.
Сжатие данных тесно связано с настройкой сети и обучением. ConvNetJS предоставляет класс Trainer, который управляет процессом обратного распространения ошибки и обновления весов:
var trainer = new convnetjs.SGDTrainer(net, {
learning_rate: 0.01,
momentum: 0.9,
batch_size: 20,
l2_decay: 0.001
});
Сжатые представления данных часто применяются для:
Эффективная комбинация сверточных слоёв, подвыборки, полносвязных слоёв и Dropout позволяет создавать нейронные сети, которые сжимают данные, сохраняя информативность, что является ключевым моментом в построении современных моделей с ограниченными ресурсами памяти и процессора.