Views
No views yet
Input: odor receptor vector (DoOR: ~52 receptors)
→ Linear(input_dim → hidden_dim, no bias)
→ 20 LIF timesteps with:
• Poisson spike encoding from rate-coded input
• Recurrent current: spk × (W_rec ⊙ mask ⊙ sign)ᵀ
• Norse LIFCell (surrogate gradient, α=100)
→ time-averaged spike rates
→ Linear(hidden_dim → num_classes)LIFCell, method="super")| File | Description |
|---|---|
model.safetensors | Trained weights (best validation checkpoint) |
config.json | Architecture hyperparameters |
connectome_mask.npz | FlyWire olfactory subgraph (binary adjacency + signs) |
connectome_meta.json | Connectome metadata (neuron count, edge count, source) |
modeling_snn.py | Standalone MaskedRecurrentLIFSNN class |
1import scipy.sparse as sp
2import torch
3from safetensors.torch import load_file
4
5# Load the model
6from modeling_snn import MaskedRecurrentLIFSNN
7
8adjacency = sp.load_npz("connectome_mask.npz")
9model = MaskedRecurrentLIFSNN(
10 input_dim=52, # from config.json
11 hidden_dim=800, # from config.json
12 num_classes=500, # from config.json
13 adjacency=adjacency,
14 steps=20,
15 alpha=100.0,
16)
17state_dict = load_file("model.safetensors")
18model.load_state_dict(state_dict)
19model.eval()
20
21# Inference
22x = torch.randn(1, 52) # receptor activation vector
23logits, spike_sparsity = model(x)
24predicted_odor = logits.argmax(dim=1).item()