our_knp/cats-dogs/README.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

67 lines
9.3 KiB
Markdown
Raw Permalink 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.

# Первый эксперимент: кошки и собаки в KNP/AltAI
**Более новый результат:** [второй эксперимент — 61,8% против 52,2% прежней сети на одном новом тесте](V2.md). Ниже сохранён отчёт первого опыта.
Это обучение весов спайковой сети через KNP STDP, без готовой нейросети для извлечения признаков. CPU-бэкенд эмулирует модель нейрона AltAI; это не измерение на физическом процессоре.
## Устройство
- Отдельная копия `mnist-learn`: `/mnt/c/KNP/cats-dogs/source` на `int@10.9.8.230`.
- Библиотеки берутся из рабочей сборки `/home/int/knp-build`; исходный пример MNIST не меняется.
- Два класса: `0 = cat`, `1 = dog`; по 20 нейронов на класс.
- Изображение 32×32 переводится в серый фиксированной целочисленной формулой BT.601. На вход подаются яркость и `255 − яркость`: 2048 каналов ON/OFF.
- Используются прежние настройки локального обучения, случайный разброс весов σ=20, seed=42; после обучения — квантование, торможение 255, добавка к порогу отключена.
- Источник исходного примера: KasperskyLab/knp, Apache 2.0. Скопированы и прежние экспериментальные изменения; правки этого опыта в C++ ограничены двумя константами `global_config.h` (число классов и размер входа).
## Данные
Первичный источник: [CIFAR-10, Alex Krizhevsky](https://www.cs.toronto.edu/~kriz/cifar.html).
Из-за медленной загрузки полного архива пилот использует **JPEG-копии** зеркала [YoongiKim/CIFAR-10-images](https://github.com/YoongiKim/CIFAR-10-images), закреплённого на коммите `d7d05618061fe37d830fb0419063d113c575ccbc`. Это не исходные байты CIFAR-10, поэтому результат нельзя напрямую выдавать за стандартный CIFAR-бенчмарк. Предварительная попытка загрузки через Hugging Face была остановлена из-за HTTP 429; её изображения не используются.
Пилот: 800 обучающих, 200 валидационных и 400 тестовых изображений, классы сбалансированы. Валидация выделена из исходного train, test — из исходного test. Список исходных индексов, SHA-256 подготовленных файлов и параметры преобразования сохраняются в `data/manifest.json`. Кэш JPEG позволяет повторить опыт с теми же байтами.
## Файлы и запуск на стенде
Скрипты лежат в `/mnt/c/KNP/cats-dogs`, данные и результаты — `/home/int/run/cats-dogs`.
```bash
# Собрать отдельный бинарник из уже скопированного и адаптированного source.
python3 /mnt/c/KNP/cats-dogs/build.py
# Подготовить небольшую выборку (numpy и Pillow в anvenv).
~/anvenv/bin/python /mnt/c/KNP/cats-dogs/prepare_jpeg.py
# Короткая проверка на 100 обучающих и 100 проверочных изображениях.
python3 /mnt/c/KNP/cats-dogs/run.py smoke --dataset smoke --train 100 --count 100
# Обучить на train, проверить на validation.
python3 /mnt/c/KNP/cats-dogs/run.py validation --train 800 --count 200
# Подготовить второй фиксированный вариант входа: локальный контраст.
~/anvenv/bin/python /mnt/c/KNP/cats-dogs/prepare_contrast.py
# Проверить 10 заранее заданных сочетаний кодирования/порога реальным KNP.
python3 /mnt/c/KNP/cats-dogs/validate.py
# После выбора порога: реальное KNP-обучение и однократная проверка test.
# В этом опыте по validation выбраны contrast и порог 60.
python3 /mnt/c/KNP/cats-dogs/run.py test --dataset contrast_train_test \
--train 800 --count 400 --threshold 60
```
`run.py` создаёт новую папку и отказывается перезаписывать существующий прогон. Сохраняет `settings.json`, полный `run.log`, исходную таблицу KNP `result.csv`, счётчики и общую точность в `metrics.json`, веса и пороги до/после квантования. Точность считается как доля всех верных ответов; молчание считается неуспехом. Названия PRECISION/RECALL из исходного примера не используются для итогового вывода, поскольку его счётчики имеют нестандартную семантику.
`tune.py` сохранён как неудачная предварительная попытка: его результат на пороге 60 разошёлся с KNP (83 против 74 верных на исходном яркостном входе). Поэтому его подбор **не использовался** для выбора модели. Все 10 конфигураций в `selection.json` измерены настоящим KNP. Причина расхождения офлайн-симулятора отдельно не исправлялась; в частности, его начальное состояние растра не учитывает предварительное кодирование train. Перед тестом сеть заново обучена на тех же train, seed и параметрах; все четыре CSV весов/порогов между выбранным валидационным и тестовым прогонами совпали побайтно (`results/reproducibility.json`).
Для полного исходного архива сохранены `download.py` (HTTP ranges с проверкой MD5) и `prepare_data.py` (8000/2000/2000). Загрузка полного архива в этой сессии остановлена из-за скорости, эти данные не использовались для пилота. `prepare_data.py` записывает файлы в переданную папку: для полного набора нужно выбрать отдельную папку, чтобы не перезаписать пилот.
## Результат 14 октября
Выбраны локальный контраст (из серого изображения вычитается размытие 5×5, результат умножается на 4 и разделяется на положительный/отрицательный каналы) и порог 60. Валидация: 111/200 верных (55,5%). Отдельный тест KNP: **208/400 верных (52%)**, 183 ошибки и 9 молчаний. Кошки: 98 верных, 97 ошибок, 5 молчаний; собаки: 110 верных, 86 ошибок, 4 молчания.
Это пока уровень около угадывания, а не полезный классификатор. На сбалансированном тесте постоянный ответ одним классом даёт 50%. У тестовой точности примерно 47,1–56,9% по интервалу Уилсона 95%: преимущество над 50% не установлено. Один seed и маленький JPEG-набор ограничивают выводы.
Полные настройки и результаты: [results/selection.json](results/selection.json), [results/test-metrics.json](results/test-metrics.json), [results/test-settings.json](results/test-settings.json). На стенде полные логи и CSV лежат в `/home/int/run/cats-dogs`; итоговый прогон — `test`. Локально сохранён архив исходников `source-snapshot.tar.gz` и архив обученных весов `trained-weights.tar.gz`. Автозапуск обучения не создавался, прежний визуализатор MNIST не менялся.
Следующий обоснованный опыт — отдельный спайковый слой локальных признаков перед классификатором, с обучением и отдельным новым тестом. Простое снижение порога и фиксированная обработка контраста уже проверены в рамках этого пилота; надёжного распознавания они не дали.