Для эффективного обучения нейронной сети в ConvNetJS критически важно правильно подготовить данные. Основная цель подготовки датасета изображений — представить информацию в формате, который библиотека способна воспринимать, минимизировать шум и ускорить процесс обучения.
ConvNetJS работает с тензорами — многомерными массивами чисел. Каждый пиксель изображения должен быть представлен числом с плавающей запятой в диапазоне 0–1 (или иногда -1 до 1, в зависимости от выбранной функции активации). Для цветных изображений используется три канала (RGB), для чёрно-белых — один канал.
Пример нормализации:
function normalizeImage(img) {
let width = img.width;
let height = img.height;
let data = [];
for (let y = 0; y < height; y++) {
for (let x = 0; x < width; x++) {
let pixel = img.getPixel(x, y); // RGB объект с компонентами r,g,b
data.push(pixel.r / 255.0);
data.push(pixel.g / 255.0);
data.push(pixel.b / 255.0);
}
}
return data;
}
ConvNetJS требует фиксированного размера входа, поэтому все изображения необходимо приводить к единому разрешению. Обычно используют квадратные форматы: 28×28, 32×32, 64×64.
Рекомендации по изменению размеров:
Чтобы увеличить размер обучающего набора и повысить устойчивость модели, применяются трансформации изображений:
Эти операции позволяют модели лучше обобщать данные и предотвращают переобучение. В ConvNetJS аугментацию можно выполнять на этапе подготовки массива пикселей, создавая дополнительные версии изображений.
ConvNetJS работает с mini-batch градиентным спуском, поэтому датасет необходимо разбивать на небольшие пакеты. Оптимальный размер пакета зависит от объема памяти и сложности модели, чаще всего используют 16–128 изображений на батч.
Пример формирования мини-батча:
function createBatch(images, labels, batchSize) {
let batchData = [];
let batchLabels = [];
for (let i = 0; i < batchSize; i++) {
let idx = Math.floor(Math.random() * images.length);
batchData.push(images[idx]);
batchLabels.push(labels[idx]);
}
return { data: batchData, labels: batchLabels };
}
Датасет необходимо разделять на тренировочную, валидационную и тестовую выборки. Обычно используют следующие пропорции:
Валидационная выборка позволяет отслеживать переобучение, тестовая — оценивать качество модели после обучения.
Для задач классификации метки категорий должны быть представлены в
виде one-hot векторов. ConvNetJS использует такой
формат для функции потерь softmax.
Пример преобразования меток:
function oneHotEncode(label, numClasses) {
let vector = new Array(numClasses).fill(0);
vector[label] = 1;
return vector;
}
Если классов много, важно поддерживать консистентное кодирование по всем выборкам.
При работе с большим количеством изображений рекомендуется:
ConvNetJS использует объект Vol для представления входного тензора:
let x = new convnetjs.Vol(width, height, depth, 0.0);
x.set(data); // data — массив нормализованных пикселей
Vol хранит не только значения пикселей, но и градиенты, необходимые для обратного распространения ошибки. Создание Vol на этапе подготовки данных позволяет напрямую передавать изображения в сеть.
Алгоритм подготовки данных:
Следование этой последовательности обеспечивает корректное обучение нейронной сети и стабильное качество предсказаний.