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>
67 lines
9.3 KiB
Markdown
67 lines
9.3 KiB
Markdown
# Первый эксперимент: кошки и собаки в 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 не менялся.
|
||
|
||
Следующий обоснованный опыт — отдельный спайковый слой локальных признаков перед классификатором, с обучением и отдельным новым тестом. Простое снижение порога и фиксированная обработка контраста уже проверены в рамках этого пилота; надёжного распознавания они не дали.
|