При обучении нейронных сетей, особенно на больших объемах данных, основной поток выполнения JavaScript может блокироваться. Это приводит к замедлению интерфейса или полной его недоступности во время тренировки сети. Для решения этой проблемы в Synaptic используется Web Worker — механизм, позволяющий выполнять вычисления в отдельном потоке.
Для запуска обучения в отдельном потоке необходимо вынести всю логику
тренировки в отдельный файл, который будет исполняться Web Worker.
Предположим, что основной файл называется main.js, а файл
воркера — trainer.js.
Пример структуры воркера:
importScripts('synaptic.js');
const { Layer, Network, Trainer } = synaptic;
let network;
self.onmess age = function(e) {
const { action, data } = e.data;
if (action === 'init') {
// Инициализация сети
const inputLayer = new Layer(data.input);
const hiddenLayer = new Layer(data.hidden);
const outputLayer = new Layer(data.output);
inputLayer.project(hiddenLayer);
hiddenLayer.project(outputLayer);
network = new Network({
input: inputLayer,
hidden: [hiddenLayer],
output: outputLayer
});
self.postMessage({ status: 'initialized' });
}
if (action === 'train') {
const trainer = new Trainer(network);
trainer.train(data.dataset, {
rate: data.rate || 0.1,
iterations: data.iterations || 10000,
error: data.error || 0.005,
shuffle: true,
log: 1000,
cost: Trainer.cost.MSE,
schedule: {
every: 1000,
do: function(stats) {
self.postMessage({ status: 'progress', stats });
}
}
});
self.postMessage({ status: 'trained', network: network.toJSON() });
}
};
Ключевые моменты:
importScripts('synaptic.js') позволяет подключить
Synaptic в контексте Web Worker.self.onmessage используется для получения команд от
основного потока.postMessage отправляет обратно сообщения о
прогрессе и завершении обучения.schedule в Trainer.train позволяет
отслеживать промежуточные результаты и передавать их в основной
поток.В основном файле создается экземпляр Web Worker и отправляются команды для инициализации и обучения сети.
const worker = new Worker('trainer.js');
// Инициализация сети
worker.postMessage({
action: 'init',
data: { input: 3, hidden: 4, output: 2 }
});
// Обработка сообщений от воркера
worker.onmess age = function(e) {
const { status, stats, network } = e.data;
if (status === 'initialized') {
console.log('Сеть инициализирована');
// Запуск обучения
worker.postMessage({
action: 'train',
data: {
dataset: [
{ input: [0,0,0], output: [0,1] },
{ input: [1,1,1], output: [1,0] }
],
iterations: 5000,
rate: 0.1
}
});
}
if (status === 'progress') {
console.log('Текущий прогресс:', stats);
}
if (status === 'trained') {
console.log('Обучение завершено');
const trainedNetwork = synaptic.Network.fromJSON(network);
// trainedNetwork готов к использованию
}
};
Важные особенности:
postMessage и JSON-сериализации позволяет
передавать сеть между потоками.schedule позволяют отображать прогресс обучения в реальном
времени.fromJSON и toJSON для
сериализации сети: это обеспечивает простую передачу сети между
потоками.Обучение нейронных сетей в Synaptic через Web Worker позволяет организовать эффективный, отзывчивый и масштабируемый процесс, особенно при работе с большими датасетами или сложными архитектурами.