Загрузка данных из CSV в браузере

Для работы с нейронными сетями в библиотеке Synaptic требуется подготовка данных в виде числовых массивов. Одним из распространённых форматов хранения данных является CSV (Comma-Separated Values). В браузере загрузка CSV и преобразование его в формат, пригодный для обучения сети, выполняется с использованием встроенных возможностей JavaScript и современных веб-API.

Чтение CSV-файлов

Для загрузки CSV-файла в браузере используется объект File и интерфейс FileReader. Предположим, что файл выбирается через элемент <input type="file">:

const inputFile = document.querySelector('#csvFileInput');

inputFile.addEventListener('change', (event) => {
    const file = event.target.files[0];
    if (!file) return;

    const reader = new FileReader();
    reader.onl oad = function(e) {
        const csvData = e.target.result;
        const parsedData = parseCSV(csvData);
        console.log(parsedData);
    };
    reader.readAsText(file);
});

В этом примере FileReader асинхронно считывает текстовое содержимое файла, а функция parseCSV обрабатывает его для дальнейшего использования.

Разбор CSV в массив чисел

CSV-файл обычно содержит строки данных с разделителями (запятые или точки с запятой). Каждая строка должна быть преобразована в массив чисел, чтобы её можно было подать на вход нейронной сети Synaptic. Простейшая функция разбора выглядит так:

function parseCSV(csv, delimiter = ',') {
    const lines = csv.trim().split('\n');
    return lines.map(line => line.split(delimiter).map(Number));
}

Особое внимание уделяется:

  • удалению лишних пробелов с помощью trim(),
  • преобразованию всех значений в числа с помощью Number,
  • корректной обработке пустых строк и ошибок формата.

Для более сложных CSV с заголовками или текстовыми метками можно использовать библиотеки типа PapaParse для точного парсинга, но базовая реализация через split подходит для учебных целей.

Подготовка данных для Synaptic

Библиотека Synaptic ожидает входные данные в виде объектов с полями input и output. После разбора CSV необходимо трансформировать массив чисел в такой формат. Пример:

const csvData = [
    [0, 0, 0],
    [0, 1, 1],
    [1, 0, 1],
    [1, 1, 0]
];

const trainingSet = csvData.map(row => ({
    input: row.slice(0, -1),
    output: [row[row.length - 1]]
}));

Здесь последние значения строк используются как целевые (output), а все остальные — как входные (input).

Масштабирование и нормализация данных

Нейронные сети Synaptic лучше обучаются на данных, нормализованных в диапазоне от 0 до 1. Простейшее масштабирование выполняется следующим образом:

function normalizeData(data) {
    const transposed = data[0].map((_, colIndex) => data.map(row => row[colIndex]));
    const mins = transposed.map(col => Math.min(...col));
    const maxs = transposed.map(col => Math.max(...col));

    return data.map(row =>
        row.map((value, index) => (value - mins[index]) / (maxs[index] - mins[index]))
    );
}

Эта функция автоматически вычисляет минимальные и максимальные значения для каждого столбца и масштабирует все данные в диапазон [0, 1].

Асинхронная загрузка больших CSV

При работе с крупными файлами важно избегать блокировки интерфейса. Для этого чтение CSV можно выполнять с использованием FileReader и Promise:

function loadCSV(file) {
    return new Promise((resolve, reject) => {
        const reader = new FileReader();
        reader.onl oad = e => resolve(parseCSV(e.target.result));
        reader.oner ror = e => reject(e);
        reader.readAsText(file);
    });
}

// Пример использования
inputFile.addEventListener('change', async (event) => {
    const file = event.target.files[0];
    if (!file) return;

    try {
        const data = await loadCSV(file);
        const normalized = normalizeData(data);
        const trainingSet = normalized.map(row => ({
            input: row.slice(0, -1),
            output: [row[row.length - 1]]
        }));
        console.log(trainingSet);
    } catch (error) {
        console.error('Ошибка загрузки CSV:', error);
    }
});

Использование асинхронных функций гарантирует, что интерфейс останется отзывчивым даже при больших файлах.

Вывод в Synaptic

После подготовки данных можно создать и обучать сеть:

const { Layer, Network, Trainer } = window.synaptic;

// Создание простой сети
const inputLayer = new Layer(trainingSet[0].input.length);
const hiddenLayer = new Layer(5);
const outputLayer = new Layer(1);

inputLayer.project(hiddenLayer);
hiddenLayer.project(outputLayer);

const myNetwork = new Network({
    input: inputLayer,
    hidden: [hiddenLayer],
    output: outputLayer
});

const trainer = new Trainer(myNetwork);
trainer.train(trainingSet, {
    rate: 0.1,
    iterations: 2000,
    error: 0.005,
    shuffle: true
});

Этот подход позволяет использовать данные из CSV непосредственно в браузере, без необходимости серверной обработки, обеспечивая полную интерактивность и динамическую настройку нейронной сети.