84 lines
8.5 KiB
Markdown
84 lines
8.5 KiB
Markdown
# MNIST на native Linux — 15 октября 2026
|
||
|
||
## Что проверяли
|
||
|
||
Предыдущие **71,25%** относятся к объектам: транспорт CIFAR-10 (самолёт, автомобиль, корабль, грузовик), validation 4000. Это не цифры и не кошки/собаки.
|
||
|
||
Новый запуск проверяет цифры MNIST: десять классов, официальный test из 10 000 изображений после обучения на официальном train из 60 000. Разные задачи и разные разбиения: разность точностей не является эффектом GPU или улучшением одной модели.
|
||
|
||
Результат нового KNP-прогона: **9223/10000 = 92.23%**. Ошибочных ответов со спайками: 633; молчаний: 144. Это реальные выходные спайки KNP, без подмены NumPy-симулятором. Старые 91,5% в отчёте 12 октября — исторический результат другой системы/сборки.
|
||
|
||
## Данные и разбиение
|
||
|
||
Источник: `examples/examples/mnist-learn/MNIST.zip`, 70 000 изображений 28×28 без IDX-заголовков и текстовые метки. Независимо скачаны канонические IDX train и t10k с `https://ossci-datasets.s3.amazonaws.com/mnist/`.
|
||
|
||
Проверены заголовки, размеры и полное побайтное совпадение архива с конкатенацией официальных train images + t10k images; аналогично проверены все метки. Train — первые 60 000, test — следующие 10 000. Нового shuffle, аугментаций или подбора параметров по этому test не было. Источники и SHA256: `/home/user/run/mnist-native-20261015/dataset-manifest.json`.
|
||
|
||
## Сеть и запуск
|
||
|
||
Использован существующий пример KNP `examples/examples/mnist-learn`, модель AltAI. STDP-обучение на CPU, затем подготовка и квантование существующим кодом, upcast нейронов к AltAILIF и синапсов к Delta, инференс тоже на CPU. По 20 нейронов на каждый из 10 классов; 15 шагов на картинку, из них 10 активных.
|
||
|
||
Настройки выбраны по историческому варианту до нового тестирования: seed 42, jitter 20, threshold 60, масштаб additional_threshold 0, глобальное торможение при инференсе 255.
|
||
|
||
Обёртка:
|
||
```bash
|
||
python3 /home/user/run/mnist-native-20261015/run_mnist.py
|
||
```
|
||
|
||
Точная дочерняя команда:
|
||
```bash
|
||
/home/user/KNP/build/bin/mnist_learn_example --model altai --train_iters 60000 --inference_iters 10000 --images /home/user/run/mnist-native-20261015/MNIST.bin --labels /home/user/run/mnist-native-20261015/MNIST.target --training_backend /home/user/KNP/build/bin/libknp-cpu-single-threaded-backend.so --logging_level error
|
||
```
|
||
|
||
Окружение:
|
||
```json
|
||
{
|
||
"KNP_COL_SIZE": "20",
|
||
"KNP_COL_JITTER": "20",
|
||
"KNP_COL_SEED": "42",
|
||
"KNP_MNIST_THR": "60",
|
||
"KNP_MNIST_ADD_THR_SCALE": "0",
|
||
"KNP_MNIST_INFER_INHIB": "255",
|
||
"KNP_MNIST_DUMP": "/home/user/run/mnist-native-20261015/weights"
|
||
}
|
||
```
|
||
|
||
Обёртка очищает унаследованные `KNP_*` и задаёт перечисленные параметры. Исходники KNP, библиотеки и объектные модели не менялись. SHA256 исполняемого файла и ключевых исходников: `code-sha256.json`. ENTER штатному примеру подаётся программно.
|
||
|
||
## Точность и время
|
||
|
||
Wall дочернего процесса: **344.284 с**. До первой строки `Inference step` прошло примерно 312.058 с; инференс и оценка заняли примерно 32.226 с. Границы измерены по stdout и включают подготовку/обработку; это не чистый kernel benchmark и не сравнение CPU/GPU. Скачивание и проверка данных не входят в wall дочернего процесса.
|
||
|
||
| Цифра | Верно | Молчание | Неверный ответ со спайками |
|
||
| --- | --- | --- | --- |
|
||
| 0 | 932 | 23 | 25 |
|
||
| 1 | 1122 | 0 | 13 |
|
||
| 2 | 931 | 25 | 76 |
|
||
| 3 | 862 | 36 | 112 |
|
||
| 4 | 901 | 10 | 71 |
|
||
| 5 | 807 | 9 | 76 |
|
||
| 6 | 907 | 11 | 40 |
|
||
| 7 | 945 | 6 | 77 |
|
||
| 8 | 916 | 16 | 42 |
|
||
| 9 | 900 | 8 | 101 |
|
||
|
||
`result.csv` — стандартный KNP evaluator. Accuracy посчитана как сумма TRUE_POSITIVES / 10000, а не среднее колонки ACCURACY по one-vs-rest классам. В этом evaluator FALSE_NEGATIVES означает отсутствие голосов, FALSE_POSITIVES — неверный немолчаливый ответ. При равных положительных максимумах выбирается меньший индекс класса.
|
||
|
||
Отдельный `spike_diagnostics.py` восстановил покартинковые голоса из штатного stdout-observer (после upcast имена потеряны и выводятся UID; единственная популяция с индексами 0–9 идентифицирована среди двух оставшихся популяций, вторая имеет индексы до 199). Все десять строк результатов совпали с evaluator (проверяется assert). Положительных ties: **196**. Полная confusion matrix с отдельным столбцом молчаний — `spike-diagnostics.json`; покартинковые ответы и голоса — `predictions.csv`.
|
||
|
||
## Артефакты и ограничения
|
||
|
||
Все файлы находятся в `/home/user/run/mnist-native-20261015`:
|
||
|
||
- `run_mnist.py`, `settings.json`, `run.log`, `runner.log`, `progress.json`, `metrics.json`, `result.csv` — воспроизводимый запуск и результат.
|
||
- `dataset-manifest.json`, четыре канонических gzip, `MNIST.bin`, `MNIST.target` — источники и данные.
|
||
- `spike_diagnostics.py`, `spike-diagnostics.json`, `predictions.csv` — независимый разбор спайков.
|
||
- `weights/float_*.csv`, `weights/quant_*.csv` — штатный dump INPUT-порогов и весов. Это не полный checkpoint. В существующем dump имя `quant_weights.csv` может перезаписываться несколькими проекциями; нельзя автоматически считать его полной матрицей растр→вход.
|
||
|
||
Полную сеть пример не сериализует: существующий `save_network.h` не вызывается, а `--inference_only` фактически не загружает модель. Поэтому новый GPU-инференс цифр на тех же весах в этом опыте не проверяли. GPU-STDP текущим integer CUDA backend не реализован. CPU выбран для сохранения штатного протокола и достоверного измерения точности; guards GPU не ослаблялись, объектный GPU backend и модели не менялись.
|
||
|
||
## Продолжение
|
||
|
||
Повтор обёртки меняет содержимое runtime: сначала сохранить готовые файлы или выбрать новый каталог в коде обёртки. Для GPU отдельно реализовать полное сохранение/загрузку подготовленной сети вместе с annotations и channel metadata, пройти guards и побайтный CPU/GPU gate на 8/32 изображениях, затем проверить весь test.
|
||
|
||
Высокая точность на MNIST test не гарантирует устойчивость произвольной нарисованной четвёрки: сдвиги, толщина и нормализация требуют отдельной оценки. Никаких commit/push не выполнялось.
|