Подготовка обучающей выборки является ключевым этапом при работе с нейронными сетями в библиотеке ConvNetJS. От корректности и структуры данных зависит точность обучения, скорость сходимости и общая эффективность модели.
ConvNetJS поддерживает несколько типов входных данных:
Векторы (Vector Input) Каждый объект представлен
одномерным массивом чисел. Например, для задачи классификации числовых
признаков можно использовать Vol объект:
var x = new convnetjs.Vol([0.1, 0.5, -0.3]);
Здесь Vol — базовый контейнер для всех данных, включая
изображения и векторы признаков.
Изображения (Image Input) Для изображений данные
должны быть представлены в виде многомерного тензора
(width, height, depth). Глубина depth
соответствует количеству каналов (например, 3 для RGB).
var img = new convnetjs.Vol(width, height, depth);
// Заполнение данных пикселей
for(var i=0; i<width*height*depth; i++) {
img.w[i] = pixelValue[i]; // pixelValue от 0 до 1
}
Преобразование изображений в диапазон [0,1] или
стандартизация по среднему и стандартному отклонению значительно
улучшает стабильность обучения.
Метки (Labels) Для задач классификации
используется целочисленная метка label от 0 до N-1, где N —
количество классов. Метки напрямую передаются в функцию
train при обучении модели:
trainer.train(x, label);Нормализация признаков критически важна для предотвращения слишком больших или слишком малых значений, которые могут замедлять сходимость. Наиболее часто применяются два подхода:
Min-Max нормализация: Приведение значений
признаков к диапазону [0,1] или [-1,1].
var normalized = (value - min) / (max - min);Z-score стандартизация: Центрирование данных относительно среднего и масштабирование по стандартному отклонению:
var standardized = (value - mean) / std;Для изображений чаще всего используется нормализация через деление на 255 или стандартизация каждого канала.
Для корректной оценки модели необходимо разделять выборку на три части:
Пример разбиения массива изображений:
var trainData = allData.slice(0, Math.floor(0.8*allData.length));
var valData = allData.slice(Math.floor(0.8*allData.length), Math.floor(0.9*allData.length));
var testData = allData.slice(Math.floor(0.9*allData.length));
Для повышения обобщающей способности сети целесообразно применять аугментацию:
Пример аугментации изображения в ConvNetJS:
function augmentImage(vol) {
// случайный горизонтальный флип
if(Math.random() > 0.5) {
vol = horizontalFlip(vol);
}
// небольшое смещение
vol = translate(vol, Math.floor(Math.random()*3)-1, Math.floor(Math.random()*3)-1);
return vol;
}
Аугментация увеличивает разнообразие данных без необходимости собирать дополнительные примеры.
Обучение нейронной сети на отдельных примерах неэффективно. ConvNetJS использует батчи, группы объектов, которые одновременно подаются в сеть:
var batchSize = 32;
for(var i=0; i<trainData.length; i+=batchSize) {
var batch = trainData.slice(i, i+batchSize);
batch.forEach(function(example) {
trainer.train(example.vol, example.label);
});
}
Батчи улучшают скорость обучения и стабилизируют градиенты.
Объект Vol является основным контейнером данных в
ConvNetJS и имеет несколько ключевых свойств:
w — одномерный массив весов или значений
признаков.dw — массив градиентов, который используется в процессе
обратного распространения ошибки.sx, sy, depth — размеры
тензора по осям.Для подготовки обучающих данных необходимо создавать Vol
для каждого объекта и заполнять массив w нормализованными
значениями признаков или пикселей.
Vol для каждого элемента данных.Подготовка обучающей выборки в ConvNetJS требует внимательного подхода к форматированию данных, их нормализации и организации структуры, что напрямую влияет на точность и устойчивость нейронной сети.