8.2 KiB
Новая быстрая модель для рисования цифр — 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 не выполнялись.