Code for paper Training Deep Normalization-Free Spiking Neural Networks with Lateral Inhibition.
All experiments are conducted with
- Python 3.12.10
- NVIDIA GeForce RTX 4090 GPUs
- CUDA 12.6
- PyTorch 2.4.1
Create the conda environment with the following command:
conda env create -f environment.yml
conda activate deepeisnnWe provide all training configurations in configs/EI-SNN.
Simply run the following command to reproduce the results on CIFAR-10 with ResNet-18 in the paper.
python train.py --scratch configs/EI-SNN/CIFAR10-ResNet18.yamlPlease modify data_path and output_dir in the configuration file before
training.
Other configuration files are also named in the format of
[Dataset]-[Arch].yaml. See configs/EI-SNN and configs/BN-SNN for more
examples.
To resume training from checkpoints, run the following command:
python train.py --resume [Checkpoint-Path]Below is detailed information about this repo, which may help further research on E-I dynamics based on our work.
DeepEISNN/
├── configs/ # YAML configs for EI-SNN and BN-SNN
│ ├── EI-SNN/ # EI-SNN experiment configs
│ └── BN-SNN/ # BN-SNN experiment configs
├── datasets/ # dataset loaders and preprocessing
├── models/ # MLP/VGG/ResNet architectures
├── modules/ # layers, normalizations, and optimizers
├── utils/ # metrics, visualization, etc.
├── eval_pretrained.py # evaluate pretrained checkpoints
└── train.py # training script
Key arguments in train.py:
--scratch <config.yaml>: train from scratch--resume <ckpt.pth>: resume training--log {0,1,2}: logging level--notes <str>: add notes about experiment--seed <int>: random seed (default 2025)
To build E-I models, you can either use the provided E-I configs or use the E-I modules in your own model. The E-I modules follow the Conv/Linear-Norm-Activation convention:
Conv2d->SpikingEiConv2dLinear->SpikingEiLinearBatchNorm2d->SpikingEiNorm2dBatchNorm1d->SpikingEiNorm1d(setoutput_layer=Truefor the final layer)
Here, prev_in_features is the fan-in (SpikingEiConv2d/Linear layer.
We provide visualization demonstrating evolving distributions of
- all trainable parameters
- inputs/outputs of all layers
during training.
Simply add --log 2 in the shell command to enable visualization. For example:
python train.py --scratch configs/EI-SNN/[Dataset]-[Arch].yaml --log 2👀 See how bimodality emerges during training!
All pretrained checkpoints are available on Hugging Face.
Use the following command to quickly evaluate the pretrained checkpoints on the evaluation set.
python eval_pretrained.py --model [Dataset]-[Arch] --data_path [Dataset-Path]The script will automatically download the corresponding weights from Hugging Face.
| Dataset | Arch | T | Top-1 Acc(%) | Model Name |
|---|---|---|---|---|
| CIFAR-10 | ResNet-18 | 4 | 92.06 | CIFAR10-ResNet18 |
| CIFAR-10 | VGG-8 | 4 | 87.03 | CIFAR10-VGG8 |
| CIFAR-10 | VGG-11 | 4 | 88.43 | CIFAR10-VGG11 |
| CIFAR-10 | VGG-16 | 4 | 91.01 | CIFAR10-VGG16 |
| CIFAR-10 | VGG-19 | 4 | 91.36 | CIFAR10-VGG19 |
| CIFAR-100 | VGG-16 | 4 | 65.90 | CIFAR100-VGG16 |
| CIFAR-100 | VGG-19 | 4 | 64.06 | CIFAR100-VGG19 |
| CIFAR10-DVS | VGG-8 | 10 | 78.40 | CIFAR10DVS-VGG8 |
| CIFAR10-DVS | VGG-11 | 10 | 78.40 | CIFAR10DVS-VGG11 |
| DVS-Gesture | VGG-8 | 16 | 95.83 | DVSGesture-VGG8 |
| TinyImageNet200 | ResNet-18 | 4 | 50.29 | TinyImageNet200-ResNet18 |
| ImageNet1k | ResNet-18 | 4 | 44.64 | ImageNet1k-ResNet18 |
If this work is helpful, please kindly cite as:
@inproceedings{
liu2026training,
title={Training Deep Normalization-Free Spiking Neural Networks with Lateral Inhibition},
author={Peiyu Liu and Jianhao Ding and Zhaofei Yu},
booktitle={The Fourteenth International Conference on Learning Representations},
year={2026},
url={https://openreview.net/forum?id=U8preGvn5G}
}If you have any questions, please feel free to contact me via email or raise an issue.

