5.2 KiB
Отчёт: размер колонки, 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. - Для статьи: сравнение с опубликованными спайковыми сетями с локальным обучением.