# Отчёт: размер колонки, 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 <папка прогона> --inhib 255 --thr 40,60`. ## Следующие шаги - [ ] ON/OFF-кодирование: добавить 784 входа, которые спайкают на пустых пикселях. Это должно бить по ошибкам 4→9, 7→9 и по «пуловеру». - [ ] Досчитать размер 80 и полный MNIST для размеров 40 и 80. - [ ] В приложении показывать, почему сеть ответила так: трафарет победителя рядом с картинкой. - [ ] Сообщить разработчикам KNP об ошибке в `ModelLoader::init_channels`. - [ ] Для статьи: сравнение с опубликованными спайковыми сетями с локальным обучением.