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

Аугментация данных является ключевым инструментом для повышения устойчивости и точности нейронных сетей, особенно когда исходные обучающие данные ограничены. В библиотеке ConvNetJS для JavaScript аугментация выполняется преимущественно на уровне ввода изображений и вектора признаков, что позволяет моделям видеть разнообразные варианты входных данных без необходимости увеличивать исходный датасет вручную.


Типы аугментации

1. Геометрические преобразования

  • Сдвиг (Translation): Изменение положения объекта в пределах изображения.

    • В ConvNetJS сдвиг реализуется через смещение координат пикселей и заполнение пустых областей нулями или отражением краевых пикселей.
  • Поворот (Rotation): Вращение изображения на угол θ.

    • Применяется матрица поворота к координатам пикселей. Важно учитывать, что поворот может обрезать часть изображения, поэтому часто используется предварительное увеличение холста (padding).
  • Масштабирование (Scaling): Увеличение или уменьшение размеров изображения.

    • Масштабирование улучшает способность сети распознавать объекты на разных расстояниях. ConvNetJS позволяет изменять размер входного массива данных с помощью методов resize для объектов типа Vol.

2. Отражение и зеркалирование (Flipping)

  • Горизонтальное и вертикальное отражение увеличивает разнообразие обучающих данных без изменения класса объектов.
  • Реализуется простым обращением индексов массива в соответствующем направлении. В JavaScript это эффективно через методы Array.reverse или прямую манипуляцию Vol массивом.

3. Шум и искажения

  • Гауссов шум добавляется к пикселям изображения для имитации естественных вариаций освещения и качества данных.
  • Случайные искажения (Random perturbation) изменяют интенсивность отдельных каналов RGB или отдельных признаков.
  • В ConvNetJS шум задается через метод addNoise(σ) объекта Vol, где σ — стандартное отклонение шума.

4. Изменение яркости, контрастности и насыщенности

  • Для работы с цветными изображениями важно учитывать вариативность условий освещения.

  • Реализуется прямым масштабированием значений пикселей:

    pixel[i] = pixel[i] * contrast + brightnessOffset;
  • Такой подход позволяет сети устойчиво классифицировать объекты при разных условиях освещения.


Практическая реализация аугментации в ConvNetJS

Создание Vol для изображения

var imgVol = new convnetjs.Vol(width, height, depth);
imgVol.setFromImage(imageElement);

Геометрическая аугментация

// Поворот на случайный угол в пределах [-15°, 15°]
var angle = (Math.random() * 30 - 15) * Math.PI / 180;
var rotatedVol = imgVol.rotate(angle);

// Сдвиг на случайные смещения dx и dy
var dx = Math.floor(Math.random() * 5 - 2);
var dy = Math.floor(Math.random() * 5 - 2);
var shiftedVol = imgVol.translate(dx, dy);

Добавление шума

imgVol.addNoise(0.05); // σ = 0.05

Комбинация аугментаций

  • В большинстве случаев аугментация более эффективна, если применять несколько методов одновременно: сдвиг + поворот + отражение + шум.
  • В ConvNetJS это достигается поочередным вызовом методов над одним объектом Vol.

Аугментация на уровне обучения

ConvNetJS поддерживает генерацию аугментированных данных в процессе обучения. Для этого создаются функции-обработчики данных, которые динамически создают новые экземпляры Vol при каждой итерации обучения:

function augmentData(vol) {
    var newVol = vol.clone();
    if(Math.random() > 0.5) newVol = newVol.flipX();
    newVol.addNoise(0.03);
    return newVol;
}

for(var i=0;i

Преимущество такого подхода — модель видит практически неограниченное количество уникальных вариаций исходного датасета, что повышает обобщающую способность сети.


Особенности работы с Vol

Объект Vol — это многомерный массив с формой [width, height, depth], используемый ConvNetJS для хранения входных данных, весов и активаций. Для аугментации важно:

  • Использовать методы clone(), чтобы сохранить исходные данные нетронутыми.
  • Следить за диапазоном значений: после добавления шума или изменения яркости необходимо нормализовать значения, чтобы они оставались в допустимом диапазоне [0,1].
  • Применять аугментацию на лету, а не создавать огромные предобработанные наборы, что экономит память и ускоряет обучение.

Влияние аугментации на производительность

  • Аугментация уменьшает переобучение, повышает точность на тестовых данных и делает сеть более устойчивой к изменениям входных данных.
  • Эффективность напрямую зависит от качества и разнообразия применяемых трансформаций. Простое зеркалирование может не дать значительного прироста, тогда как комбинация геометрических и цветовых преобразований обеспечивает заметное улучшение.
  • В ConvNetJS аугментация особенно полезна при работе с небольшими датасетами (например, меньше нескольких тысяч изображений).