Динамически создаваемая нейронная сеть на 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 --releaseNeuralNetwork— веса, смещения, конфигурация слоёв, learning rateNeuralNetworkInternal— активации по слоям для обучения backpropogationFeedForward,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