Log night experiments: spiking readout, learned object features, punishment
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
parent
795f75a65b
commit
cf386f4e36
2 changed files with 45 additions and 0 deletions
|
|
@ -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=<d>` в `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}.
|
||||
|
|
|
|||
28
objects/prepare_big.py
Normal file
28
objects/prepare_big.py
Normal file
|
|
@ -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))
|
||||
Loading…
Add table
Reference in a new issue