Библиотека ml5.js обеспечивает удобный интерфейс для работы с машинным обучением в браузере на языке JavaScript. Одним из наиболее мощных инструментов является работа с многомерными входами и выходами, что позволяет строить модели для сложных задач регрессии и классификации, включая обработку изображений, аудио, сенсорных данных и комбинаций различных типов данных.
Многомерные входы представляют собой векторы или матрицы
значений, где каждая строка соответствует одному объекту, а
столбцы — признакам объекта. В ml5.js для работы с такими данными
используется объект NeuralNetwork, который позволяет
автоматически масштабировать входы и управлять размерностью.
Пример структуры многомерного входа:
const trainingData = [
{ input: { x: 0.1, y: 0.2, z: 0.5 }, output: { label: 'A' } },
{ input: { x: 0.3, y: 0.6, z: 0.1 }, output: { label: 'B' } },
{ input: { x: 0.8, y: 0.4, z: 0.9 }, output: { label: 'C' } }
];
В этом примере каждый объект имеет три признака
x, y, z, что делает входную
матрицу размерностью N x 3, где N — количество
объектов в обучающем наборе.
Для работы с многомерными входами нужно задать конфигурацию сети с
учетом количества признаков. В ml5.js это делается через опции при
создании NeuralNetwork:
const options = {
task: 'classification',
debug: true,
inputs: ['x', 'y', 'z'],
outputs: ['label']
};
const nn = ml5.neuralNetwork(options);
Ключевой момент: inputs и outputs
должны соответствовать названиям ключей в тренировочных данных.
Для регрессии outputs задаются числовыми значениями.
После создания сети необходимо добавить данные:
trainingData.forEach(item => nn.addData(item.input, item.output));
Подготовка данных к обучению включает нормализацию признаков, что критично для корректной работы с многомерными данными:
nn.normalizeData();
Нормализация автоматически масштабирует значения каждого признака в
диапазон [0,1], что предотвращает доминирование одного
признака над другими.
Многомерные выходы требуют особого внимания к выбору функции потерь и
метрики. В ml5.js для классификации используется
categoricalCrossentropy, для регрессии —
meanSquaredError. Параметры обучения задаются через
объект trainOptions:
const trainOptions = {
epochs: 100,
batchSize: 12
};
nn.train(trainOptions, whileTraining, finishedTraining);
Функция whileTraining позволяет отслеживать прогресс
обучения:
function whileTraining(epoch, loss) {
console.log(`Эпоха: ${epoch}, Потеря: ${loss.loss}`);
}
Многомерный выход — это несколько предсказаний одновременно, например, координаты точки в пространстве или вероятности нескольких классов. Для примера регрессии с тремя выходами:
const outputData = [
{ input: { x: 0.1, y: 0.2, z: 0.3 }, output: { a: 0.5, b: 0.7, c: 0.2 } },
{ input: { x: 0.4, y: 0.6, z: 0.1 }, output: { a: 0.2, b: 0.9, c: 0.3 } }
];
const options = {
task: 'regression',
debug: true,
inputs: ['x', 'y', 'z'],
outputs: ['a', 'b', 'c']
};
const nn = ml5.neuralNetwork(options);
outputData.forEach(item => nn.addData(item.input, item.output));
nn.normalizeData();
nn.train({ epochs: 200 });
После обучения модель способна предсказывать сразу три значения для каждого набора входных данных:
nn.predict({ x: 0.2, y: 0.4, z: 0.6 }, (err, results) => {
console.log(results); // [{ a: 0.45, b: 0.72, c: 0.28 }]
});
Многомерные входы и выходы легко комбинируются с изображениями, звуком и сенсорными потоками, используя возможности ml5.js для предварительной обработки. Например, признаки изображения можно представить как многомерный вектор, который затем подается на нейросеть вместе с числовыми данными из сенсоров.
ml5.js поддерживает вывод статистики обучения и визуализацию ошибок
через callback whileTraining. Для сложных многомерных задач
рекомендуется строить графики потерь и прогнозов по каждому
выходу, чтобы оценить эффективность модели на каждом компоненте
выходного вектора.