18 lines
1.4 KiB
Python
18 lines
1.4 KiB
Python
from pathlib import Path
|
|
import numpy as np,json
|
|
R=Path.home()/'run/pets-knp';a=np.load(R/'training-counts.npz');y=np.tile(np.load(R/'data/train.npz')['labels'],2);yv=np.load(R/'data/val.npz')['labels'];rows=[];best=None
|
|
for mode in ['counts','sqrt','root_l2']:
|
|
def enc(x):
|
|
if mode=='counts':return x
|
|
q=np.sqrt(x.astype(np.float64))
|
|
if mode=='sqrt':q*=24
|
|
else:q*=2048/np.maximum(np.sqrt((q*q).sum(1,keepdims=True)),1)
|
|
return np.clip(np.rint(q),0,640).astype(np.int32)
|
|
xt=enc(a['train']);xv=enc(a['validation']);mu=xt.mean(0);sd=xt.std(0)+1e-3;z=(xt-mu)/sd;A=z.T@z;v=z.T@(y*2.-1)
|
|
for lam in (10,100,1000,10000):
|
|
sol=np.linalg.solve(A+lam*np.eye(800),v);w=sol/sd;b=(y*2.-1).mean()-mu@w
|
|
for limit in (31,):
|
|
scale=limit/abs(w).max();wq=np.rint(w*scale).astype(np.int32);bq=int(round(b*scale));margin=xv.astype(np.int64)@wq+bq
|
|
row={'encoding':mode,'lambda':lam,'weight_limit':limit,'validation_accuracy':float(((margin>0)==yv).mean()),'float_validation':float(((xv@w+b>0)==yv).mean()),'ties':int((margin==0).sum())};rows.append(row);print(row,flush=True)
|
|
if best is None or row['validation_accuracy']>best[0]:best=(row['validation_accuracy'],dict(row),wq,bq)
|
|
_,row,w,b=best;M=R/'readout-v3';M.mkdir(exist_ok=False);w.tofile(M/'weights.bin');np.array([b],np.int32).tofile(M/'bias.bin');row['candidates']=rows;(M/'selection.json').write_text(json.dumps(row,indent=2));print('BEST',row,flush=True)
|