51 lines
8.2 KiB
Markdown
51 lines
8.2 KiB
Markdown
# Новая быстрая модель для рисования цифр — 15 октября 2026
|
||
|
||
## Результат
|
||
|
||
Сайт: **http://10.9.8.230:8080/fast_viz.html**. На старых altai_viz.html и aug_viz.html добавлена видимая ссылка; прежние модели и симуляция сохранены.
|
||
|
||
На официальном MNIST test новая модель распознала **9830/10000 = 98.30%**, против9223/10000=92,23% у отдельно проверенного штатного KNP-примера. Проверены те же10 000 изображений и метки; новая модель имеет другую архитектуру и подготовку данных. Это сравнение качества моделей, а не улучшение/ускорение существующего KNP backend. Ошибок новой модели170 вместо777. Цифра3 на пользовательском скриншоте (official test index2534) теперь распознана как3. Она была известна как регрессионный пример и не использовалась для обучения/выбора параметров.
|
||
|
||
## Что именно является спайковой сетью
|
||
|
||
Вход:784 токовых значения пикселей. Скрытый слой:256 integer integrate-and-fire нейронов. На каждом из128 конечных шагов каждый нейрон накапливает постоянный ток; при достижении порога испускает один спайк и вычитает порог. Числа спайков идут в **линейный аналоговый readout** на10 классов. Это гибридная IF-сеть; не вся сеть спайковая. Состояния обнуляются для каждого изображения.
|
||
|
||
JS действительно выполняет все конечные IF-шаги. Python использует математически эквивалентный floor(T*drive/threshold) для счётчика; равенство проверено независимой реализацией браузера. Integer веса и токи хранятся в безопасном диапазоне точной JS Number арифметики. scale4096, hidden cap4, threshold4177920; weights1 и weights2 int16, bias1/bias2 int32.
|
||
|
||
Модель обучена offline: MLP784→256→10 с clipped ReLU, Adam и surrogate gradient через квантование активностей к spike counts после двух стартовых эпох. Это неSTDP. Работа новой модели в KNP, наGPU или физическом AltAI **не проверена**; сайт честно сообщает это. Никакие прежние CUDA/транспортные модели не менялись.
|
||
|
||
## Разделение данных и выбор
|
||
|
||
Взяты ранее побайтно проверенные канонические MNIST train60000/test10000. Train случайно разделён с seed20261015 на55000 обучения и5000 validation; индексы сохранены в split.npz. Для нового обучения используется только train55000. Аугментации только в train: сдвиг±2px, утолщение/утоньшение крестом радиуса1 по10% образцов. Нормализация bbox по пикселям>16 в рамку20px с bilinear resize и целочисленным сдвигом центра массы к13.5; одинаковый алгоритм Python/JS.
|
||
|
||
20 эпох, batches256, Adam beta.9/.999, L2.00005, learning rate.001, умножение на.35 на эпохах13 и18. Checkpoint выбран по validation при64 шагах: эпоха17, точность98.54%. Затем число шагов выбрано только по validation: [{"steps": 32, "accuracy": 0.9846}, {"steps": 64, "accuracy": 0.9854}, {"steps": 128, "accuracy": 0.9856}]; зафиксированы128 шагов. После фиксации test оценён один раз и не использовался для тюнинга. train/validation/test provenance и SHA256 сохранены; test gallery — только демонстрация.
|
||
|
||
## Устойчивость и пределы
|
||
|
||
После выбора модели выполнен заранее фиксированный stress на тех же test-картинках, без последующего подбора:
|
||
- Сдвиг нормализованной картинки вправо2px:97,74%.
|
||
- Утолщение крестом радиуса1:96,85%.
|
||
- Утоньшение крестом радиуса1:91,41%.
|
||
|
||
Утоньшение заметно ухудшает качество; не выдавать98,30% за гарантию для любого рисунка. Stress применяется после нормализации, без повторной нормализации; это отдельный контроль представления. Полная confusion matrix и все покартинковые ответы сохранены. Очень редкий/непривычный почерк всё ещё может ошибаться. Пустой холст UI распознавать не пытается.
|
||
|
||
## Проверка браузера и скорость
|
||
|
||
Chromium headless/CDP:85 фиксированных raw MNIST примеров, включая2534 и псевдослучайные test-индексы seed444. Для каждого точно совпали все784 байта нормализации,256IFcounts,10выходныхscores и prediction между Python и реальным JS128шагов. В `browser-check.json` записаны:
|
||
- Gallery2534→3, blank→«—» и отсутствие top scores.
|
||
- Настоящие CDP mouse и touch события нарисовали1; оба распознаны как1.
|
||
- Mobile390px без горизонтальногоoverflow.
|
||
- Очистка остаётся пустой после ожидания debounce150ms.
|
||
- JavaScript exceptions:0.
|
||
|
||
Для нормализованной настоящей test-картинки2534 после20 прогревов,100 повторов: медиана **0.500мс**, p95 **1.100мс**. Измерен только simulate(), без canvas-нормализации/DOM; это локальный headless Chromium на машине ассистента, не пользовательский компьютер. UI показывает локальную фактическую задержку каждого распознавания. Обучение заняло11.537с wall по сохранённому логу; это NumPyCPU, не CUDA.
|
||
|
||
## Пути и запуск
|
||
|
||
- Репозиторий: `/home/user/KNP/mnist-fast/{model_core.py,train_fast.py,make_parity.py,browser_check.py,README.md}`.
|
||
- Веб: `/home/user/KNP/viz/fast_viz.html`, `fast-model.js`, `fast-model.json`, `fast-gallery.json`.
|
||
- Runtime: `/home/user/run/mnist-fast`; `best.npz`, `split.npz`, `normalized.npy`, `history.json`, `selection.json`, `metrics.json`, `test_results.npz`, `provenance.json`, `model.json`, `gallery.json`.
|
||
- Проверки: `parity-cases.json`, `browser-check.json`, `fast-viz-desktop.png`, `fast-viz-mobile.png`, `browser-check.log`.
|
||
- Сервер прежний PID58749: `/home/user/run/mnist-viz/server.py`, порт8080, каталогviz, UTF8. Новый сервис не запускался, перезагрузка сервера не нужна.
|
||
|
||
Команда обучения и предупреждение о перезаписи runtime — в mnist-fast/README.md. Все скрипты, обученные веса, индексы и метрики сохраняются; сырыеMNIST уже сохранены отдельным опытом. После обучения зафиксирован `source-sha256.json`; архив артефактов и локальная копия отчёта сохраняются отдельно. Commit/push не выполнялись.
|