ConvNetJS — это чисто клиентская JavaScript-библиотека для построения и обучения нейронных сетей, в том числе сверточных (CNN). Она реализует как прямое распространение, так и обратное распространение ошибки, поддерживает различные слои, функции активации и оптимизаторы. Основная особенность библиотеки — возможность работы непосредственно в браузере, без серверной части, что позволяет экспериментировать с нейронными сетями в интерактивной среде.
В основе ConvNetJS лежит модель слоя за слоем, где каждый слой может быть свёрточным, подвыборочным, полностью связанным или нелинейным. Слои соединяются в цепочку, формируя вычислительный граф, по которому происходит распространение данных и ошибок.
Шумоподавление в ConvNetJS реализуется как задача регрессии или восстановления сигнала. Исходный шумный сигнал или изображение подается на вход сети, а целевой сигнал — это “чистая” версия данных. Задача сети — минимизировать разницу между восстановленным и эталонным сигналом.
Для работы с шумоподавлением данные необходимо представить в виде тензоров (Vol). Каждый Vol содержит трехмерные массивы: ширина, высота и глубина (channels).
Пример подготовки изображения для сети:
var x = new convnetjs.Vol(width, height, depth);
for (var i = 0; i < width * height * depth; i++) {
x.w[i] = noisyImageData[i];
}
Для обучения необходимо иметь два набора данных: входные с шумом и чистые эталонные изображения.
Эффективные модели шумоподавления используют сверточные слои без подвыборки, чтобы сохранить пространственную информацию. Типичная архитектура:
Для регрессии используется L2 Loss Layer, минимизирующая среднеквадратичное отклонение между предсказанием и эталонным сигналом:
var layer_defs = [];
layer_defs.push({type:'input', out_sx:width, out_sy:height, out_depth:depth});
layer_defs.push({type:'conv', sx:3, filters:32, stride:1, pad:1, activation:'relu'});
layer_defs.push({type:'conv', sx:3, filters:32, stride:1, pad:1, activation:'relu'});
layer_defs.push({type:'conv', sx:3, filters:depth, stride:1, pad:1});
layer_defs.push({type:'regression', num_neurons:width*height*depth});
Оптимизация выполняется с помощью
Trainer:
var net = new convnetjs.Net();
net.makeLayers(layer_defs);
var trainer = new convnetjs.Trainer(net, {
method: 'adam',
learning_rate: 0.001,
l2_decay: 0.0001
});
Особенности обучения для шумоподавления:
var json = net.toJSON();
Для подавления шума на новом изображении:
var inputVol = new convnetjs.Vol(width, height, depth);
inputVol.w = noisyImageData;
var outputVol = net.forward(inputVol);
var denoisedImageData = outputVol.w;
forward — выполняет прямое распространение по
сети.outputVol.w содержит восстановленные пиксельные
значения.Если нужно получить изображение для отображения, значения нормализуются или преобразуются в диапазон 0–255.
Использование этих приемов в ConvNetJS требует ручной настройки архитектуры, но позволяет строить сети, сравнимые с простыми вариантами U-Net в браузерной среде.
Шумоподавление с ConvNetJS — это комбинация тонкой настройки архитектуры сверточной сети, грамотного выбора функции потерь и подготовки данных, что позволяет решать задачи восстановления сигналов и изображений полностью на стороне клиента.