Skip to content
stalker57241Public

Latest commit

 

History

24 Commits

Folders and files

Repository files navigation

nn-rust

Динамически создаваемая нейронная сеть на Rust с нуля. Без внешних ML-библиотек.

WIP: проект в активной разработке, API может меняться.

Что это

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

Проект в данный момент учебный, но с реальной задачей: классификация MNIST.

Возможности

  • Динамическая конфигурация сети: задана [784, 192, 96, 10] или любая другая
  • Прямой проход (forward) и обратный (backprop) с нуля
  • Онлайн-обучение (SGD по одному примеру)
  • Bias на каждом слое
  • Функции активации через трейт Act (сейчас SIGMOID)
  • Экспоненциальный decay learning rate
  • Загрузчик формата IDX (MNIST)

Текущий результат

MNIST, конфигурация [784, 192, 96, 10], 350 эпох:

  • Train loss: 0.0008
  • Test loss: 0.016
  • Test accuracy: 98.14%

Структура

  • src/ — библиотека (neuro.rs, main.rs)
  • mnist/ — данные формата IDX
  • Cargo.toml — зависимости (только rand)

Запуск

Данные для проверки MNIST уже загружены в папку mnist/

  • train-images-idx3-ubyte
  • train-labels-idx1-ubyte
  • t10k-images-idx3-ubyte
  • t10k-labels-idx1-ubyte

Сборка и запуск:

cargo run --release

Для высокой скорости обучения обязательна сборка и запуск --release, иначе обучение в разы медленнее. В Cargo.toml включены lto и codegen-units = 1.

Только сборка:

cargo build --release

Что внутри

  • NeuralNetwork — веса, смещения, конфигурация слоёв, learning rate
  • NeuralNetworkInternal — активации по слоям для обучения backpropogation
  • FeedForward, FeedForwardInternal, FeedForwardRaw — трейты интерфейса для возможности настроить собственное обучение
  • Act — обёртка для хранения функций (активация, производная)
    • Пример использования: сигмоида static SIGMOID: Act = (|x| 1.0 / (1.0 + (-x).exp()), |x| x * (1.0 - x));
  • Randomf32 — генератор случайных чисел. Используется для создания весов из указанного диапазона:
    • Randomf32::0 - нижний порог
    • Randomf32::1 - верхний порог

Планы

  • Softmax + cross-entropy для классификации
  • Разные функции активации на разные слои (ReLU, tanh)
  • Сохранение и загрузка весов
  • Оптимизация: переиспользование буферов, flatten весов

Зависимости

  • Библиотека rand

Лицензия

MIT

Releases

Contributors

Languages