Подготовка входных данных для нейронной сети

Эффективная работа нейронной сети напрямую зависит от качества и формата входных данных. Библиотека Synaptic в JavaScript предоставляет гибкие инструменты для создания и обучения сетей, однако требует строгого соблюдения правил подготовки данных для корректного обучения.


Формат входных данных

Сеть Synaptic принимает данные в виде массивов чисел с плавающей точкой. Каждый входной вектор должен соответствовать числу входных нейронов сети, а каждый выходной — числу выходных нейронов.

Пример структуры данных:

const trainingSet = [
  { input: [0, 0], output: [0] },
  { input: [0, 1], output: [1] },
  { input: [1, 0], output: [1] },
  { input: [1, 1], output: [0] }
];
  • input — массив длиной равной количеству входных нейронов.
  • output — массив длиной равной количеству выходных нейронов.
  • Все значения должны быть нормализованы, чаще всего в диапазоне от 0 до 1.

Нормализация данных

Для корректного обучения крайне важно нормализовать данные. Ненормализованные значения могут привести к нестабильной работе сети или медленной сходимости. Основные подходы:

  1. Минимум–максимум Перевод значений в диапазон [0,1]:

    function normalize(value, min, max) {
      return (value - min) / (max - min);
    }
  2. Z-score нормализация Центрирование и масштабирование через среднее и стандартное отклонение:

    function zScore(value, mean, std) {
      return (value - mean) / std;
    }

Для категориальных данных применяется one-hot кодирование, где каждая категория представляется отдельным входным нейроном с бинарным значением:

// Пример one-hot кодирования для 3 категорий
// Категория 0 → [1, 0, 0]
// Категория 1 → [0, 1, 0]
// Категория 2 → [0, 0, 1]

Разделение данных на обучающую и тестовую выборки

Для оценки качества сети данные делят на тренировочную и тестовую выборки. Рекомендуемое соотношение — 70–80% данных для обучения, 20–30% — для тестирования.

function splitData(data, trainRatio = 0.8) {
  const trainSize = Math.floor(data.length * trainRatio);
  return {
    train: data.slice(0, trainSize),
    test: data.slice(trainSize)
  };
}

Корректное разделение важно для выявления переобучения и проверки способности сети к обобщению.


Преобразование сложных данных

  1. Текстовые данные Текст необходимо кодировать в числовой формат, например через Bag of Words или TF-IDF. Прямое использование строк в Synaptic невозможно.

  2. Изображения Пиксели переводятся в одномерный массив чисел [0,1]. Размер массива должен совпадать с количеством входных нейронов:

const flattenedImage = imageData.data.map(pixel => pixel / 255);
  1. Временные ряды Создание скользящих окон для обучения сети прогнозированию будущих значений:
function createSlidingWindows(series, windowSize) {
  const windows = [];
  for (let i = 0; i <= series.length - windowSize - 1; i++) {
    windows.push({
      input: series.slice(i, i + windowSize),
      output: [series[i + windowSize]]
    });
  }
  return windows;
}

Проверка данных перед обучением

  • Все входные массивы должны быть одинаковой длины.
  • Значения должны быть нормализованы.
  • Не должно быть пропусков (undefined, null, NaN).
  • Выходные данные должны соответствовать типу задачи: регрессия — числовые значения, классификация — one-hot массивы.

Итоговые рекомендации по подготовке данных

  • Преобразование исходных данных в числовой формат с нормализацией.
  • Разделение данных на тренировочную и тестовую выборки.
  • Применение кодирования категорий и скользящих окон для текстов и временных рядов.
  • Проверка корректности размеров массивов и отсутствия пропусков.

Правильная подготовка входных данных существенно повышает эффективность обучения сети в Synaptic и уменьшает риск ошибок при работе с различными типами задач.