From cf386f4e362d77de45037ffa5ff4853b2b8e3ca2 Mon Sep 17 00:00:00 2001 From: int Date: Wed, 14 Oct 2026 21:17:39 +0300 Subject: [PATCH] Log night experiments: spiking readout, learned object features, punishment Co-Authored-By: Claude Opus 5.5 --- changes-2026-10-14.md | 17 +++++++++++++++++ objects/prepare_big.py | 28 ++++++++++++++++++++++++++++ 2 files changed, 45 insertions(+) create mode 100644 objects/prepare_big.py diff --git a/changes-2026-10-14.md b/changes-2026-10-14.md index 89797c8..0992e79 100644 --- a/changes-2026-10-14.md +++ b/changes-2026-10-14.md @@ -270,3 +270,20 @@ KNP, validation: `fc_v_plain` 81,0%, `fc_v_augB` 79,5%. Симулятор (2000 ### Досчитались ночные прогоны (20:34) - `aug_v_A90k` (30 000 исходных × 3 = 90 000, 4593 с): KNP validation 88,6%. Симулятор (2000): как есть 89,5%, сдвиг 2 px 83,8%, толще 69,2%, тоньше 76,2%. Больше исходных картинок не вернуло точность на чистых (B 87,8%), устойчивость к сдвигу чуть выше B (81,5%), к толщине хуже. - Размер колонки, тест: 80 нейронов, 30k — 89,6% (s42) и 91,1% (s1), в среднем 90,3% (хуже 20/40); 40 нейронов, 60k — 92,8% (s42; 20 нейронов, 60k `fin60k_s42` — 92,2%). `sz80_60k_s42` ещё считается. + +## Ночь 14→15 октября: компьютер отдан под эксперименты, главная цель — объекты + +### Спайковый выходной слой (обучение вне чипа, распознавание целочисленными нейронами AltAI) +- `readout/spiking_readout.py`: ridge-регрессия на числах спайков, веса квантуются в ±255, выход — по нейрону на класс (порог, сброс в 0, потенциал не ниже 0, вход «смещение» спайкает каждый активный шаг); ответ — нейрон с наибольшим числом спайков. `readout/robustness.py` — устойчивость. +- MNIST, validation 10 000: пиксели — 65% (линейный слой на пикселях слаб); штрихи fine — 93,2%; штрихи coarse — 94,9% при пороге 8 (float 96,7%). +- Устойчивость (coarse, обучение на признаках `augA`, 90 000): как есть 95,1%, сдвиг 2 px 89,9%, толще 91,1%, тоньше 74,6% (лучшие колонки: 91,9 / 66,6 / 80,8 / 80,2). + +### Кошки/собаки: узкое место — признаки +- Спайковый/линейный выход на HOG v2 (`features-v2`): ~60% (колонки STDP — 62,6%). Классификатор не спасает: HOG не хватает. +- `objects/kmeans_features.py`: признаки, выученные без меток (Coates & Ng 2011): кусочки 6×6×3, нормировка контраста, ZCA, сферические k-средние (= соревновательное обучение «победитель забирает всё»), активация max(0, ⟨p, d⟩ − α), сумма по четвертям картинки. +- Validation v2 (обучение 4000, линейный выход, ridge): K=400 — 73,9%, с зеркальными копиями 75,1–75,6%; K=800 α=0,25 + зеркало — **77,4%** (HOG + колонки STDP было 62,6%). +- `objects/fetch_more.py`: докачаны JPEG того же зеркала/коммита train 2000–4499 для cat и dog (5000 файлов). `objects/prepare_big.py` → `~/run/cats-dogs/data-v3`: train 9000 (0–4499 на класс), val 1000 (4500–4999, побайтно те же картинки, что v2 val). Пересечений с val/test нет. Test не используется. + +### Наказание неверных колонок в STDP (MNIST) +- `KNP_COL_PUNISH=` в `models/altai/construct_network.cpp`: проекция target→input, дофамин −d·1000 всем колонкам, кроме колонки метки (награда 0,179376). В KNP отрицательный дофамин ослабляет синапсы, внёсшие вклад, у нейронов, спайкавших в последние 10 шагов; принудительно сработавший нейрон наказание игнорирует. +- Короткие прогоны (3000 обучение, 1000 проверка): пиксели — без наказания 85,9%, 0,005–0,06 — 83,7–84,8%, 0,18 — 76,6%. Coarse-признаки: без наказания 69,8%, 0,0005–0,003 — 62–71%, 0,005–0,02 — 73–79%, 0,18 — сеть молчит. Разброс большой; ночью полные прогоны `augment/punish_runs.sh`: 30 000, p ∈ {0; 0,005; 0,012} × seed {42, 1}. diff --git a/objects/prepare_big.py b/objects/prepare_big.py new file mode 100644 index 0000000..a655fc2 --- /dev/null +++ b/objects/prepare_big.py @@ -0,0 +1,28 @@ +"""Cats/dogs v3 data: train = CIFAR-10 JPEG mirror train 0000–4499 per class (9000 images), +validation = train 4500–4999 per class (same images as v2 validation). Test is not touched. + +usage: ~/anvenv/bin/python prepare_big.py → /home/int/run/cats-dogs/data-v3/{train,val}.npz +""" +from pathlib import Path + +import numpy as np +from PIL import Image + +cache = Path('/home/int/run/cats-dogs/data/github-jpeg-cache') +out = Path('/home/int/run/cats-dogs/data-v3') +out.mkdir(exist_ok=True) + + +def load(lo, hi, seed): + items = [(label, cls, i) for cls, label in enumerate(('cat', 'dog')) for i in range(lo, hi)] + order = np.random.default_rng(seed).permutation(len(items)) + items = [items[j] for j in order] + rgb = np.stack([np.asarray(Image.open(cache / f'train-{label}-{i:04d}.jpg').convert('RGB')).transpose(2, 0, 1) + for label, _, i in items]) + return rgb, np.array([c for _, c, _ in items], dtype=np.uint8), [f'train/{l}/{i:04d}' for l, _, i in items] + + +for name, lo, hi in [('train', 0, 4500), ('val', 4500, 5000)]: + rgb, labels, names = load(lo, hi, 20261015) + np.savez_compressed(out / f'{name}.npz', rgb=rgb, labels=labels, names=np.array(names)) + print(name, rgb.shape, np.bincount(labels))