ConvNetJS — это библиотека для построения и обучения нейронных сетей прямо в браузере на JavaScript. Одним из ключевых этапов работы с изображениями является предобработка пикселей, которая обеспечивает корректное представление данных для нейронной сети и повышает эффективность обучения.
Предобработка пикселей включает в себя несколько обязательных шагов:
Изображения обычно имеют пиксели с целочисленными значениями от 0 до 255. Для нейронных сетей такие значения слишком велики, что может замедлять обучение и вызывать проблемы с градиентным спуском. В ConvNetJS используется следующая практика:
function normalizeImage(imgData) {
let normalized = [];
for (let i = 0; i < imgData.length; i++) {
normalized.push(imgData[i] / 255.0);
}
return normalized;
}
Ключевой момент: значения пикселей должны быть приведены к диапазону [0, 1] или [-1, 1] в зависимости от активационной функции сети. Для сигмоидальных функций лучше использовать [0, 1], для тангенса гиперболического — [-1, 1].
Центрирование — это вычитание среднего значения пикселей, что позволяет ускорить сходимость обучения:
function centerImage(imgData) {
let mean = imgData.reduce((sum, val) => sum + val, 0) / imgData.length;
return imgData.map(val => val - mean);
}
Пояснение: если использовать только нормализацию, значения будут в допустимом диапазоне, но распределение может быть смещено. Центрирование устраняет смещение и делает данные более «нейтральными» для сети.
ConvNetJS оперирует с объектами Vol, которые
представляют собой многомерные тензоры: ширина × высота × глубина
(channels). Для обычного RGB-изображения это будет
(width, height, 3).
Преобразование происходит следующим образом:
let Vol = require('convnetjs').Vol;
function imageToVol(normalizedData, width, height) {
return new Vol(width, height, 3, 0.0, normalizedData);
}
Особенности:
width и height — размеры изображения.
ConvNetJS требует, чтобы все изображения в батче имели одинаковые
размеры.depth — количество каналов: 1 для grayscale, 3 для
RGB.Vol позволяет хранить данные с возможностью последующей
передачи через слои сети.После нормализации, центрирования и изменения размерности пиксели преобразуются в тензор Vol. Этот объект затем используется для создания батчей и подачи на вход сети.
Пример формирования батча изображений:
let images = [img1, img2, img3]; // массив с пиксельными данными
let batch = images.map(img => {
let normalized = normalizeImage(img.data);
let centered = centerImage(normalized);
return imageToVol(centered, img.width, img.height);
});
Ключевой момент: каждый элемент батча должен быть экземпляром Vol с одинаковой размерностью. Это обеспечивает корректную работу всех слоев ConvNetJS, включая сверточные и полносвязные.
function standardizeImage(imgData) {
let mean = imgData.reduce((sum, val) => sum + val, 0) / imgData.length;
let variance = imgData.reduce((sum, val) => sum + (val - mean) ** 2, 0) / imgData.length;
let std = Math.sqrt(variance);
return imgData.map(val => (val - mean) / std);
}
Правильная предобработка пикселей напрямую влияет на:
Предобработка является фундаментальным шагом при работе с ConvNetJS и формирует основу для успешного обучения нейронных сетей на изображениях.