Библиотека Synaptic предоставляет удобные средства для создания и обучения нейронных сетей на языке JavaScript. Ключевым элементом успешного обучения является корректное представление обучающих данных. Неправильная структура или масштабирование выборки часто приводит к плохой сходимости или неправильным результатам.
В Synaptic обучающая выборка представляет собой массив объектов, где каждый объект содержит два обязательных свойства:
Пример структуры:
let trainingSet = [
{ input: [0, 0], output: [0] },
{ input: [0, 1], output: [1] },
{ input: [1, 0], output: [1] },
{ input: [1, 1], output: [0] }
];
Каждый элемент массива соответствует одному примеру
обучения, при этом порядок значений в массиве
input должен строго соответствовать входным нейронам
сети.
Для корректного обучения нейронной сети все входные и выходные данные должны быть числовыми и нормализованными. Наиболее распространённые диапазоны:
[0, 1] или [-1, 1][0, 1] для задач классификации или
[0, 1]/[-1, 1] для регрессииЕсли данные не нормализованы, функция активации нейронов может выйти за пределы оптимальной области, что приведёт к медленной сходимости или стагнации обучения.
Пример нормализации:
function normalize(value, min, max) {
return (value - min) / (max - min);
}
let trainingSet = [
{ input: [normalize(10, 0, 100), normalize(50, 0, 100)], output: [0.5] }
];
Для успешного обучения требуется достаточный объём и разнообразие обучающих примеров. Если набор данных слишком мал, сеть просто запомнит входы без способности к обобщению. В Synaptic рекомендуется:
Выходные данные сети могут быть как скалярными, так и многомерными массивами. Для задач классификации, где требуется определить один класс из нескольких, используется one-hot encoding:
let trainingSet = [
{ input: [0, 1], output: [1, 0, 0] }, // класс 0
{ input: [1, 0], output: [0, 1, 0] }, // класс 1
{ input: [1, 1], output: [0, 0, 1] } // класс 2
];
Для регрессионных задач выходы обычно остаются в виде одного значения или массива чисел, соответствующего предсказанным величинам.
Иногда удобно создавать обучающий набор автоматически. Пример для задачи XOR:
function generateXORSet() {
return [
{ input: [0, 0], output: [0] },
{ input: [0, 1], output: [1] },
{ input: [1, 0], output: [1] },
{ input: [1, 1], output: [0] }
];
}
let trainingSet = generateXORSet();
Программная генерация позволяет легко расширять выборку, добавлять шум или создавать сложные многомерные данные без ручного ввода каждого примера.
Synaptic не ограничивает формат входных данных исключительно массивами чисел, но для совместимости с тренерами сети и методами обучения данные должны быть приведены к массиву чисел. При необходимости можно конвертировать объекты с помощью функций:
function objectToArray(obj, keys) {
return keys.map(key => obj[key]);
}
let data = { x: 5, y: 10 };
let inputArray = objectToArray(data, ['x', 'y']); // [5, 10]
Это позволяет использовать реальные датасеты с именованными полями и структурировать обучение гибко.
Метод Trainer.train() ожидает именно массив объектов
{input, output}. Любое отклонение от этого формата приведёт
к ошибкам или некорректному обучению. Параметры обучения, такие как
rate (скорость обучения), iterations и
error, работают напрямую с этим форматом, поэтому важно
заранее подготовить данные правильно.
Если требуется, я могу дополнительно создать раздел с примерами для многоклассовой классификации и регрессии, где будет показано, как правильно форматировать выборку для сложных задач. Это будет полезно для полного понимания работы Synaptic с разными типами данных.