Распознавание рукописных цифр на упрощённом наборе

Synaptic — это JavaScript-библиотека для построения нейронных сетей. Она поддерживает как перцептроны, так и многослойные сети с обратным распространением ошибки (backpropagation). Архитектура сети в Synaptic строится на трех ключевых компонентах: Neuron, Layer, Network.

  • Neuron представляет отдельный нейрон с весами и функцией активации.
  • Layer объединяет нейроны в слой и управляет связями между ними.
  • Network объединяет слои в полную сеть и обеспечивает методы обучения и предсказания.

В Synaptic функции активации настраиваются для каждого нейрона, но чаще всего используется стандартная сигмоида, обеспечивающая значения выхода в диапазоне от 0 до 1.

Построение сети для распознавания цифр

Для распознавания рукописных цифр используется многослойный перцептрон с одним скрытым слоем. Архитектура сети включает:

  1. Входной слой: размер равен количеству пикселей изображения (например, 28×28 = 784 для упрощённого набора).
  2. Скрытый слой: 64–128 нейронов, количество подбирается экспериментально.
  3. Выходной слой: 10 нейронов, соответствующих цифрам от 0 до 9.
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:

  • Цифра 3 → [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 итераций
});
  • rate влияет на скорость корректировки весов.
  • iterations определяет максимальное количество проходов через весь набор данных.
  • error задаёт целевое значение ошибки для остановки обучения.
  • shuffle повышает устойчивость сети к переобучению.

Прогнозирование и тестирование

После обучения сеть способна распознавать новые изображения:

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;

Оптимизация и улучшение качества

Для повышения точности распознавания используют:

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

Практическая заметка

При работе с упрощённым набором данных размер входного вектора уменьшается, что снижает время обучения и позволяет экспериментировать с архитектурой сети на локальной машине без GPU. Несмотря на упрощение, принципы работы с Synaptic остаются идентичными для больших наборов, таких как MNIST.

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