Synaptic — это гибкая библиотека для создания и обучения нейронных сетей на JavaScript. Она поддерживает различные типы сетей: от простых перцептронов до рекуррентных сетей и сети Левенберга–Маркувича. Для обучения нейронной сети необходимы корректно подготовленные данные, часто хранящиеся в формате CSV. Node.js предоставляет удобные средства для чтения и обработки таких файлов, что позволяет интегрировать их с Synaptic.
CSV-файлы (Comma-Separated Values) представляют собой текстовые файлы, где каждая строка соответствует одному примеру данных, а значения разделены запятыми (или другими разделителями). Пример структуры для обучения нейронной сети регрессии или классификации:
feature1,feature2,feature3,label
0.2,0.5,0.1,1
0.7,0.1,0.8,0
Ключевые моменты:
[0, 1].Для работы с CSV в Node.js можно использовать встроенный модуль
fs или специализированные библиотеки, такие как
csv-parser или papaparse. Рассмотрим
использование csv-parser.
const fs = require('fs');
const csv = require('csv-parser');
let data = [];
fs.createReadStream('data.csv')
.pipe(csv())
.on('data', (row) => {
// Преобразование значений в числа
const input = [
parseFloat(row.feature1),
parseFloat(row.feature2),
parseFloat(row.feature3)
];
const output = [
parseInt(row.label)
];
data.push({ input, output });
})
.on('end', () => {
console.log('CSV файл успешно загружен');
console.log(data);
});
Важные моменты:
{ input: [...], output: [...] }.После загрузки данных можно создать нейронную сеть. Например, многослойный перцептрон с одним скрытым слоем:
const synaptic = require('synaptic');
const { Layer, Network, Trainer } = synaptic;
// Создание слоев
const inputLayer = new Layer(3);
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
});
Ключевые моменты:
one-hot – число классов).Synaptic предоставляет класс Trainer, который упрощает
обучение на наборе данных:
const trainer = new Trainer(myNetwork);
// Данные должны быть массивом объектов с input и output
trainer.train(data, {
rate: 0.1, // скорость обучения
iterations: 20000, // количество итераций
error: 0.005, // допустимая ошибка
shuffle: true, // перемешивание данных
log: 1000 // лог прогресса каждые N итераций
});
Особенности:
rate определяет величину изменения весов за одну
итерацию.iterations задаёт максимальное количество проходов по
данным.error позволяет остановить обучение, если достигнута
желаемая точность.shuffle помогает избежать переобучения на упорядоченных
данных.Перед подачей данных в сеть рекомендуется нормализовать входные значения:
function normalize(arr) {
const max = Math.max(...arr);
const min = Math.min(...arr);
return arr.map(x => (x - min) / (max - min));
}
data = data.map(item => ({
input: normalize(item.input),
output: item.output
}));
Рекомендации:
one-hot.[0,1].После обучения можно использовать сеть для предсказаний:
const testInput = [0.6, 0.2, 0.9];
const normalizedInput = normalize(testInput);
const prediction = myNetwork.activate(normalizedInput);
console.log('Предсказание сети:', prediction);
Примечания:
Synaptic поддерживает экспорт сети в JSON для последующего использования без повторного обучения:
const jsonNetwork = myNetwork.toJSON();
fs.writeFileSync('network.json', JSON.stringify(jsonNetwork));
// Восстановление сети
const loadedNetwork = Network.fromJSON(JSON.parse(fs.readFileSync('network.json')));
Преимущества:
Хотите, я могу подготовить следующую часть статьи с примерами работы с большими CSV-файлами и батчевой обработкой данных для ускоренного обучения? Это будет полезно для практических проектов.