Ecosyste.ms: Awesome
An open API service indexing awesome lists of open source software.
https://github.com/Dengyu-Wu/spkeras
Conversion from CNNs to SNNs using Tensorflow-Keras
https://github.com/Dengyu-Wu/spkeras
ann-snn-conversion ann-to-snn-conversion cnn-to-snn-conversion snn-keras snn-training spiking-neural-networks spkeras
Last synced: about 1 month ago
JSON representation
Conversion from CNNs to SNNs using Tensorflow-Keras
- Host: GitHub
- URL: https://github.com/Dengyu-Wu/spkeras
- Owner: Dengyu-Wu
- License: mit
- Created: 2020-11-19T16:13:11.000Z (about 4 years ago)
- Default Branch: master
- Last Pushed: 2023-05-12T20:39:43.000Z (over 1 year ago)
- Last Synced: 2024-02-17T11:32:40.168Z (11 months ago)
- Topics: ann-snn-conversion, ann-to-snn-conversion, cnn-to-snn-conversion, snn-keras, snn-training, spiking-neural-networks, spkeras
- Language: Python
- Homepage:
- Size: 483 KB
- Stars: 29
- Watchers: 3
- Forks: 7
- Open Issues: 1
-
Metadata Files:
- Readme: README.md
- License: LICENSE
Awesome Lists containing this project
README
## SpKeras 2.0
SpKeras can easily get and evaluate rate-based spiking neural networks (SNNs), by following steps:
* Pre-train Convolutional neural networks (CNNs) using Tensorflow-keras
* Convert CNNs into SNNs using SpKeras
* Evaluate SNNs and get parameters, e.g. weights, bias and thresholds### Built With
* [Tensorflow-keras](https://www.tensorflow.org/guide/keras/sequential_model)## New Features
* Works with Keras Functional API## Getting Started
The package is tested in Python 3.7.6 and Tensorflow 2.3.1.### Prerequisites
1. Install tensorflow
```sh
pip install tensorflow
```### Installation
1. Clone the repo
```sh
git clone https://github.com/Dengyu-Wu/spkeras.git
```
### Coding for SpKeras
SpKeras will detect the Activation Layer in CNN to create SpikeActivation Layer. It means all activation function should stay inside Activation Layer, including Softmax and Sigmoid.```python
#Sequential model
model.add(Conv2D(64, (3, 3), padding='same')
model.add(BatchNormalization())
model.add(Activation('relu'))#Functional API
x = Conv2D( 64, (3,3), padding="same")(inputs)
x = BatchNormalization()(x)
node = Activation("relu")(x)
x = Conv2D( 64, (3,3), padding="same")(node)
x = BatchNormalization()(x)
x = Activation("relu")(x)
x = add([x, node])
```### Example
```python
#load dataset and cnn model
from tensorflow.keras.datasets import cifar10
from tensorflow.keras.models import load_model(x_train, y_train), (x_test, y_test) = cifar10.load_data()
x_train = x_train/255
x_test = x_test/255
x_train = x_train.astype('float32')
x_test = x_test.astype('float32')
y_train = keras.utils.to_categorical(y_train, 10)
y_test = keras.utils.to_categorical(y_test, 10)cnn_model = load_model('cnn_model.h5')
#Convert CNN into SNN
from spkeras.models import cnn_to_snn#Current normalisation using cnn_to_snn
##Default: signed_bit=0, amp_factor=100, method=1, epsilon = 0.001snn_model = cnn_to_snn(signed_bit=0)(cnn_model,x_train)
#Evaluate SNN accuracy
##Default: timesteps=256, thresholding=0.5, scaling_factor=1, noneloss=False, spike_ext=0
_,acc = snn_model.evaluate(x_test,y_test,timesteps=256)#Count SNN spikes
##Default: timesteps=256, thresholding=0.5, scaling_factor=1, noneloss=False, spike_ext=0, mode=0
s_max,s = snn_model.SpikeCounter(x_train,timesteps=256)#Count neuron numbers
##Default: mode = 0
n = snn_model.NeuronNumbers(mode=0)
```#### Attributes
```python
'''
--------------------------
cnn_to_snn
--------------------------
sigbed_bit: bitwidth of weights, default 0 (32-bit)
amp_factor: amplification factor, default 100
method : default 1
epsilon : 0.001
--------------------------
evaluate & SpikeCounter
--------------------------
timesteps : inference time, default 256.
thresholding: default 0.5.
noneloss : noneloss mode, default False.
spike_ext : extra inference time, default 0. (-1 for unlimited inference time)
--------------------------
SpikeCounter
--------------------------
mode: set 1 to count number of neurons under different spikes, default 0
--------------------------
NeuronNumber
--------------------------
mode: set 1 to exclude average pooling layer, default 0
'''
```## Examples
_For more examples, please refer to the [Examples](./examples/)_
## License
Distributed under the MIT License. See [LICENSE](./LICENSE) for more information.
## Citation
For more details, please refer to the paper.```
@article{wu2022little,
title={A Little Energy Goes a Long Way: Build an Energy-Efficient, Accurate Spiking Neural Network From Convolutional Neural Network},
author={Wu, Dengyu and Yi, Xinping and Huang, Xiaowei},
journal={Frontiers in neuroscience},
volume={16},
year={2022}
}
```