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>
9.3 KiB
Первый эксперимент: кошки и собаки в KNP/AltAI
Более новый результат: второй эксперимент — 61,8% против 52,2% прежней сети на одном новом тесте. Ниже сохранён отчёт первого опыта.
Это обучение весов спайковой сети через 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.
Из-за медленной загрузки полного архива пилот использует JPEG-копии зеркала 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.
# Собрать отдельный бинарник из уже скопированного и адаптированного 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/test-metrics.json, results/test-settings.json. На стенде полные логи и CSV лежат в /home/int/run/cats-dogs; итоговый прогон — test. Локально сохранён архив исходников source-snapshot.tar.gz и архив обученных весов trained-weights.tar.gz. Автозапуск обучения не создавался, прежний визуализатор MNIST не менялся.
Следующий обоснованный опыт — отдельный спайковый слой локальных признаков перед классификатором, с обучением и отдельным новым тестом. Простое снижение порога и фиксированная обработка контраста уже проверены в рамках этого пилота; надёжного распознавания они не дали.