Для работы с нейронными сетями в библиотеке Synaptic требуется подготовка данных в виде числовых массивов. Одним из распространённых форматов хранения данных является CSV (Comma-Separated Values). В браузере загрузка CSV и преобразование его в формат, пригодный для обучения сети, выполняется с использованием встроенных возможностей JavaScript и современных веб-API.
Для загрузки 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-файл обычно содержит строки данных с разделителями (запятые или точки с запятой). Каждая строка должна быть преобразована в массив чисел, чтобы её можно было подать на вход нейронной сети 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 ожидает входные данные в виде объектов с полями
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 можно выполнять с использованием
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);
}
});
Использование асинхронных функций гарантирует, что интерфейс останется отзывчивым даже при больших файлах.
После подготовки данных можно создать и обучать сеть:
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 непосредственно в браузере, без необходимости серверной обработки, обеспечивая полную интерактивность и динамическую настройку нейронной сети.