| import numpy as np |
| conv=np.load("/counts_conv.npy").astype(float) |
| sys7k=np.load("/counts_sys7k.npy").astype(float) |
| vis=np.load("/counts_vision.npy").astype(float) |
| L,E=conv.shape |
| print("=== ANALISIS EXPERTOS DE VISION ===") |
| va=(vis>0).sum(1) |
| print(f"expertos activados por tokens VISUALES: min={va.min()} max={va.max()} mean={va.mean():.0f} de {E}") |
| print(f"activaciones visuales totales: {vis.sum()/1e6:.1f}M") |
| puros=0 |
| for l in range(L): |
| cr=np.argsort(np.argsort(conv[l])) |
| ve=np.where(vis[l]>0)[0] |
| p=[e for e in ve if cr[e]<E*0.35] |
| puros+=len(p) |
| print(f"expertos ESPECIALIZADOS en vision (activos imagen, raros texto): {puros/L:.0f} prom/capa") |
| overlap=[] |
| for l in range(L): |
| tv=set(np.argsort(-vis[l])[:100]); tc=set(np.argsort(-conv[l])[:100]) |
| overlap.append(len(tv&tc)/100) |
| print(f"overlap top-100 vision vs texto: {np.mean(overlap)*100:.0f}%") |
| def norm(c): s=c.sum(1,keepdims=True); s[s==0]=1; return c/s |
| nc,ns,nv=norm(conv),norm(sys7k),norm(vis) |
| print("=== SELECCION 4 CORTES (garantizando vision) ===") |
| for N in [200,250,300,350]: |
| sel=np.zeros((L,N),dtype=np.int64); vt=0 |
| for l in range(L): |
| score=0.6*nc[l]+0.2*ns[l]+0.2*nv[l] |
| order=np.argsort(-score); chosen=set() |
| ve=np.where(vis[l]>0)[0] |
| vs=ve[np.argsort(-vis[l][ve])]; cap=min(len(vs),int(N*0.35)) |
| for e in vs[:cap]: |
| if len(chosen)<N: chosen.add(int(e)) |
| vt+=len(chosen) |
| for e in order: |
| if len(chosen)>=N: break |
| chosen.add(int(e)) |
| sel[l]=sorted(chosen)[:N] |
| np.save(f"/sel_{N}.npy",sel) |
| print(f" N={N}: {vt/L:.0f} expertos de vision garantizados/capa") |
| print("DONE") |
|
|