our_knp/Отчёт_размер_колонки_и_одежда.md
int 8f43927575 Initial import: KNP experiments (examples, viz, cats-dogs, reports)
examples/ is based on KasperskyLab/knp at 55470ed6 with local changes
to the mnist-learn altai/blifat models, cuda-backend CMake and model_loader.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-14 18:17:15 +03:00

68 lines
5.2 KiB
Markdown
Raw 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.

# Отчёт: размер колонки, Fashion-MNIST и визуализатор
Oct 13, 2026
Колонки из 20 нейронов уже дают максимум: 40 нейронов точнее не делают. На Fashion-MNIST сеть упирается примерно в 55%. Причина та же, что у самых частых ошибок на цифрах: сеть не замечает, чего на картинке не хватает. Сделано приложение, где работу сети видно по шагам.
## Размер колонки (MNIST, обучение 30 000 картинок)
Настройки как в лучшем варианте прошлого отчёта: `KNP_COL_JITTER=20`, `KNP_MNIST_THR=60`, `KNP_MNIST_ADD_THR_SCALE=0`, `KNP_MNIST_INFER_INHIB=255`. Тест — 10 000 картинок, результаты из KNP.
| Нейронов в колонке | seed 42 | seed 1 | В среднем |
| --- | --- | --- | --- |
| 5 | 88,7% | 89,4% | 89,0% |
| 10 | 89,5% | 88,9% | 89,2% |
| 20 | 92,3% | 91,5% | **91,9%** |
| 40 | 92,1% | 91,7% | **91,9%** |
| 80 | считается | считается | |
Не досчитались к концу дня: размер 80 на 30 000 картинок и размеры 40 и 80 на полном MNIST (папки `~/run/exp/sz*`). Если WSL закрывался, их нужно запустить заново.
## Fashion-MNIST
Это фотографии одежды того же формата 28×28, 10 классов. Цифры ниже — валидация (обучающие картинки 50 000–59 999), порог подобран в симуляторе.
| Обучение | Исходная сеть | Колонки |
| --- | --- | --- |
| 3 000 | 57,6% | 55,0% |
| 30 000 | 40,5% | 55,3% |
- Классы «пальто» (4) и «рубашка» (6) не получают ни одного ответа, почти всё забирает «пуловер» (2).
- Даже при пороге 5 около трети картинок остаётся без ответа: сумма весов нужной колонки на них отрицательная.
- Исходная сеть от длинного обучения деградирует, колонки держатся.
## Главная слабость сети
Спайки шлют только закрашенные пиксели, пустой пиксель молчит. Нейрон не получает сигнала «здесь должна быть линия, а её нет», поэтому выигрывает колонка с более широкой фигурой. Самые частые ошибки на тесте MNIST подтверждают это:
| Верно → ответ | Раз из 10 000 |
| --- | --- |
| 4 → 9 | 63 |
| 7 → 9 | 57 |
| 9 → 4 | 31 |
| 8 → 9 | 30 |
| 3 → 9 | 25 |
Вторая слабость — чувствительность к толщине линии. Если утолщить цифры теста на 1 пиксель, точность колонок падает с 90% до 67%, на 2 пикселя — до 8%.
## Что не помогло (проверено в симуляторе)
| Идея | Результат |
| --- | --- |
| Точнее квантовать веса (сейчас фактически от −6 до +2) | без изменений: 3 бит на вес хватает |
| Порог каждого нейрона пропорционален сумме его положительных весов | без изменений |
## Визуализатор
- Страница: https://claude.ai/artifact/6Ze9kBxeu5bxWW5zLh1Qro (закреплена в боковой панели claude.ai), локальная копия — `C:\knp\viz\altai_viz.html`.
- Показывает спайки растра по шагам, заряд всех входных нейронов, голоса колонок, карты весов и таблицу ошибок. Можно нарисовать свою цифру.
- Исходники в `C:\knp\viz` (git): `altai_sim.py` — симулятор (с KNP расходится на 0,1%), `export_data.py` — сборка страницы, `app.html` — шаблон.
- Запуск симулятора: `~/anvenv/bin/python /mnt/c/knp/viz/altai_sim.py <папка прогона> <images.bin> <labels.target> --inhib 255 --thr 40,60`.
## Следующие шаги
- [ ] ON/OFF-кодирование: добавить 784 входа, которые спайкают на пустых пикселях. Это должно бить по ошибкам 4→9, 7→9 и по «пуловеру».
- [ ] Досчитать размер 80 и полный MNIST для размеров 40 и 80.
- [ ] В приложении показывать, почему сеть ответила так: трафарет победителя рядом с картинкой.
- [ ] Сообщить разработчикам KNP об ошибке в `ModelLoader::init_channels`.
- [ ] Для статьи: сравнение с опубликованными спайковыми сетями с локальным обучением.