Data augmentation представляет собой стратегию увеличения разнообразия обучающих данных за счёт искусственного создания новых примеров на основе существующих. В задачах компьютерного зрения это особенно важно, поскольку нейронные сети обладают высокой емкостью и склонны к переобучению при ограниченном объёме данных. ConvNetJS предоставляет гибкие возможности для реализации data augmentation прямо в браузере на JavaScript, что позволяет экспериментировать с различными типами трансформаций без необходимости внешних библиотек.
Инвариантность модели Цель data augmentation — научить сеть быть устойчивой к вариациям входных данных, которые не меняют смысл объекта. Например, для распознавания цифр из MNIST небольшие сдвиги, повороты или масштабирование изображений не изменяют их класс.
Искусственное увеличение обучающего множества Каждый образец может быть трансформирован множеством способов, создавая “новые” примеры. Это снижает риск переобучения и способствует более стабильной генерализации.
Комбинирование с другими методами регуляризации Data augmentation эффективно работает в связке с Dropout, L2-регуляризацией или batch normalization, усиливая способность сети к обобщению.
ConvNetJS предлагает встроенные функции для создания аугментированных
данных через API convnetjs.Vol и трансформации изображений.
Ключевые подходы:
Сдвиги и трансляции (Translation) Изображение можно смещать по горизонтали и вертикали. В ConvNetJS это реализуется путём создания новой Vol и копирования данных с смещением, заполняя пустые области нулями или случайным шумом.
Масштабирование и ресайз (Scaling/Resizing) Пропорциональное изменение размеров изображений помогает сети корректно классифицировать объекты разного масштаба. ConvNetJS позволяет изменять размер через функции ресэмплинга Vol.
Повороты и отражения (Rotation & Flipping) Повороты на произвольные углы и горизонтальные/вертикальные отражения расширяют пространство обучающих данных. Особенно полезно для симметричных объектов, например, при распознавании букв или цифр.
Шум и изменение яркости (Noise/Brightness
Augmentation) Добавление случайного шума или изменение яркости
имитирует реальные условия съёмки, что повышает устойчивость сети к
вариациям. В ConvNetJS это можно реализовать через метод
add или прямое изменение значений пикселей в Vol.
function augmentImage(vol) {
let augmented = vol.clone(); // Клонируем исходный Vol
// Случайный сдвиг
let dx = Math.floor(Math.random() * 3) - 1;
let dy = Math.floor(Math.random() * 3) - 1;
augmented.translate(dx, dy);
// Случайный поворот
let angle = (Math.random() - 0.5) * Math.PI / 6;
augmented.rotate(angle);
// Добавление шума
for (let i = 0; i < augmented.w.length; i++) {
augmented.w[i] += 0.05 * (Math.random() - 0.5);
}
return augmented;
}
При каждой эпохе или мини-батче данные могут генерироваться на лету:
let batch = [];
for (let i = 0; i < batchSize; i++) {
let idx = Math.floor(Math.random() * trainingSet.length);
batch.push(augmentImage(trainingSet[idx]));
}
net.train(batch, labels);
Это позволяет создавать практически бесконечный поток разнообразных образцов без увеличения объёма исходного датасета.
Баланс между агрессивной аугментацией и сохранением структуры данных Сильные трансформации могут исказить смысл изображений, что ухудшит обучение. Например, слишком сильный поворот или слишком большой сдвиг цифры MNIST может сделать её нераспознаваемой.
Онлайн vs офлайн аугментация ConvNetJS хорошо подходит для онлайн-аугментации на этапе обучения, что экономит память и позволяет динамически варьировать трансформации.
Преимущества в браузере Так как ConvNetJS работает в браузере, генерация аугментированных данных на лету устраняет необходимость в предобработке на сервере или локальной машине, что особенно полезно для интерактивных образовательных приложений.
Data augmentation в ConvNetJS является мощным инструментом для борьбы с переобучением, позволяя создавать модели, устойчивые к вариациям входных данных и более эффективные на небольших датасетах.