Synaptic — это JavaScript-библиотека для построения нейронных сетей. Она поддерживает как перцептроны, так и многослойные сети с обратным распространением ошибки (backpropagation). Архитектура сети в Synaptic строится на трех ключевых компонентах: Neuron, Layer, Network.
В Synaptic функции активации настраиваются для каждого нейрона, но чаще всего используется стандартная сигмоида, обеспечивающая значения выхода в диапазоне от 0 до 1.
Для распознавания рукописных цифр используется многослойный перцептрон с одним скрытым слоем. Архитектура сети включает:
const synaptic = require('synaptic');
const { Layer, Network } = synaptic;
// Входной слой
const inputLayer = new Layer(784);
// Скрытый слой
const hiddenLayer = new Layer(64);
// Выходной слой
const outputLayer = new Layer(10);
// Связь слоев
inputLayer.project(hiddenLayer);
hiddenLayer.project(outputLayer);
// Создание сети
const myNetwork = new Network({
input: inputLayer,
hidden: [hiddenLayer],
output: outputLayer
});
Данные для сети должны быть нормализованы. Каждый пиксель изображения преобразуется в значение от 0 до 1, где 0 — белый, 1 — черный. Метки цифр переводятся в one-hot encoding:
[0, 0, 0, 1, 0, 0, 0, 0, 0, 0].Для обучения используется массив объектов вида:
{
input: [...784 значений...],
output: [...10 значений...]
}
Обучение сети осуществляется методом обратного распространения ошибки с помощью класса Trainer:
const { Trainer } = synaptic;
const trainer = new Trainer(myNetwork);
trainer.train(trainingSet, {
rate: 0.1, // скорость обучения
iterations: 20000, // количество итераций
error: 0.005, // порог ошибки для остановки
shuffle: true, // перемешивание данных
log: 1000 // вывод прогресса каждые 1000 итераций
});
После обучения сеть способна распознавать новые изображения:
const result = myNetwork.activate(newInput); // newInput — массив из 784 значений
const predictedDigit = result.indexOf(Math.max(...result));
activate возвращает массив из 10 элементов, где каждый
элемент — вероятность соответствующей цифры. Метод
indexOf(Math.max(...)) позволяет определить цифру с
наибольшей вероятностью.
Для оценки точности сети на тестовом наборе используют подсчёт совпадений:
let correct = 0;
testSet.forEach(data => {
const output = myNetwork.activate(data.input);
const predicted = output.indexOf(Math.max(...output));
const actual = data.output.indexOf(1);
if(predicted === actual) correct++;
});
const accuracy = correct / testSet.length;
Для повышения точности распознавания используют:
При работе с упрощённым набором данных размер входного вектора уменьшается, что снижает время обучения и позволяет экспериментировать с архитектурой сети на локальной машине без GPU. Несмотря на упрощение, принципы работы с Synaptic остаются идентичными для больших наборов, таких как MNIST.
Сеть на Synaptic обладает гибкой архитектурой, что позволяет легко экспериментировать с количеством слоёв, нейронов, функциями активации и методами обучения, обеспечивая понимание базовых принципов работы нейронных сетей на практике.