Подготовка датасета изображений

Для эффективного обучения нейронной сети в 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.

Рекомендации по изменению размеров:

  • Использовать билинейную интерполяцию для сохранения плавности изображения.
  • Минимизировать изменение пропорций, чтобы не исказить содержимое.
  • Для классификации объектов важно сохранять соотношение сторон при масштабировании, при необходимости добавляя пустые поля (padding).

Аугментация данных

Чтобы увеличить размер обучающего набора и повысить устойчивость модели, применяются трансформации изображений:

  • Повороты и отражения
  • Масштабирование и кроппинг
  • Изменение яркости и контрастности
  • Шум и размытие

Эти операции позволяют модели лучше обобщать данные и предотвращают переобучение. В 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 };
}

Разделение данных

Датасет необходимо разделять на тренировочную, валидационную и тестовую выборки. Обычно используют следующие пропорции:

  • 70% — тренировочная выборка
  • 15% — валидационная выборка
  • 15% — тестовая выборка

Валидационная выборка позволяет отслеживать переобучение, тестовая — оценивать качество модели после обучения.


Метки и кодирование классов

Для задач классификации метки категорий должны быть представлены в виде one-hot векторов. ConvNetJS использует такой формат для функции потерь softmax.

Пример преобразования меток:

function oneHotEncode(label, numClasses) {
    let vector = new Array(numClasses).fill(0);
    vector[label] = 1;
    return vector;
}

Если классов много, важно поддерживать консистентное кодирование по всем выборкам.


Оптимизация хранения

При работе с большим количеством изображений рекомендуется:

  • Использовать массивы Float32 вместо обычных массивов для экономии памяти.
  • Хранить датасет на диске в формате JSON или бинарных файлов, чтобы ускорить загрузку.
  • Загружать изображения по мере необходимости, а не все сразу в оперативную память.

Преобразование изображений в Vol объекты

ConvNetJS использует объект Vol для представления входного тензора:

let x = new convnetjs.Vol(width, height, depth, 0.0);
x.set(data); // data — массив нормализованных пикселей

Vol хранит не только значения пикселей, но и градиенты, необходимые для обратного распространения ошибки. Создание Vol на этапе подготовки данных позволяет напрямую передавать изображения в сеть.


Сборка полного датасета

Алгоритм подготовки данных:

  1. Загрузка и изменение размеров всех изображений.
  2. Нормализация пикселей.
  3. Применение аугментаций (по необходимости).
  4. Преобразование в Vol объекты.
  5. Формирование мини-батчей.
  6. Разделение на тренировочные, валидационные и тестовые наборы.
  7. Присвоение меток в формате one-hot.

Следование этой последовательности обеспечивает корректное обучение нейронной сети и стабильное качество предсказаний.