our_knp/reports/2026-10-15/Отчёт_MNIST_native.md

84 lines
8.5 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# 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 не выполнялось.