Bahasa Inggris | 中文 (Cina)

Spikingjelly adalah kerangka pembelajaran mendalam sumber terbuka untuk Spiking Neural Network (SNN) berdasarkan Pytorch.
Dokumentasi Spikingjelly ditulis dalam bahasa Inggris dan Cina: https://spikingjelly.readthedocs.io.
Perhatikan bahwa Spikingjelly didasarkan pada Pytorch. Pastikan Anda telah menginstal Pytorch sebelum Anda menginstal SpikingJelly.
Catatan Versi
Nomor versi ganjil adalah versi yang berkembang, diperbarui dengan repositori GitHub/OpenI. Nomor versi genap adalah versi stabil dan tersedia di PYPI.
Dokter default adalah untuk versi pengembangan terbaru. Jika Anda menggunakan versi stabil, jangan lupa untuk beralih ke dokumen dalam versi yang sesuai.
Dari versi 0.0.0.0.14 , modul termasuk clock_driven dan event_driven diganti namanya. Silakan merujuk ke tutorial migrasi dari versi lama.
Jika Anda menggunakan SpikingJelly versi lama, Anda mungkin menemukan beberapa bug fatal. Lihat sejarah bug dengan rilis untuk detail lebih lanjut.
Dokumen untuk versi yang berbeda:
Instal versi stabil terakhir dari PYPI :
pip install spikingjellyInstal versi pengembangan terbaru dari kode sumber :
Dari GitHub:
git clone https://github.com/fangwei123456/spikingjelly.git
cd spikingjelly
python setup.py installDari openi:
git clone https://openi.pcl.ac.cn/OpenI/spikingjelly.git
cd spikingjelly
python setup.py installSpikingjelly ramah pengguna. Membangun Snn dengan Spikingjelly sesederhana membangun Ann di Pytorch:
nn . Sequential (
layer . Flatten (),
layer . Linear ( 28 * 28 , 10 , bias = False ),
neuron . LIFNode ( tau = tau , surrogate_function = surrogate . ATan ())
)Jaringan sederhana ini dengan encoder Poisson dapat mencapai akurasi 92% pada dataset uji MNIST. Baca lihat tutorial untuk detail lebih lanjut. Anda juga dapat menjalankan kode ini di terminal Python untuk pelatihan tentang mengklasifikasikan MNIST:
python - m spikingjelly . activation_based . examples . lif_fc_mnist - tau 2.0 - T 100 - device cuda : 0 - b 64 - epochs 100 - data - dir < PATH to MNIST > - amp - opt adam - lr 1e-3 - j 8 SpikingJelly mengimplementasikan antarmuka konversi Ann-SNN yang relatif umum. Pengguna dapat mewujudkan konversi melalui Pytorch. Terlebih lagi, pengguna dapat menyesuaikan mode konversi.
class ANN ( nn . Module ):
def __init__ ( self ):
super (). __init__ ()
self . network = nn . Sequential (
nn . Conv2d ( 1 , 32 , 3 , 1 ),
nn . BatchNorm2d ( 32 , eps = 1e-3 ),
nn . ReLU (),
nn . AvgPool2d ( 2 , 2 ),
nn . Conv2d ( 32 , 32 , 3 , 1 ),
nn . BatchNorm2d ( 32 , eps = 1e-3 ),
nn . ReLU (),
nn . AvgPool2d ( 2 , 2 ),
nn . Conv2d ( 32 , 32 , 3 , 1 ),
nn . BatchNorm2d ( 32 , eps = 1e-3 ),
nn . ReLU (),
nn . AvgPool2d ( 2 , 2 ),
nn . Flatten (),
nn . Linear ( 32 , 10 )
)
def forward ( self , x ):
x = self . network ( x )
return xJaringan sederhana dengan pengkodean analog ini dapat mencapai akurasi 98,44% setelah konversi pada dataset uji MNIST. Baca tutorial untuk detail lebih lanjut. Anda juga dapat menjalankan kode ini di terminal Python untuk pelatihan tentang mengklasifikasikan MNIST menggunakan model yang dikonversi:
> >> import spikingjelly . activation_based . ann2snn . examples . cnn_mnist as cnn_mnist
> >> cnn_mnist . main () Spikingjelly menyediakan dua backend untuk neuron multi-langkah. Anda dapat menggunakan backend torch ramah pengguna untuk dengan mudah mengkode dan men-debug dan menggunakan backend cupy untuk kecepatan pelatihan yang lebih cepat.
Gambar berikut membandingkan waktu eksekusi dua backend dari neuron multi-langkah lif ( float32 ):

float16 juga disediakan oleh backend cupy dan dapat digunakan dalam pelatihan presisi campuran otomatis.
Untuk menggunakan backend cupy , silakan instal cupy. Perhatikan bahwa backend cupy hanya mendukung GPU, sedangkan backend torch mendukung CPU dan GPU.
Sesederhana menggunakan pytorch.
> >> net = nn . Sequential ( layer . Flatten (), layer . Linear ( 28 * 28 , 10 , bias = False ), neuron . LIFNode ( tau = tau ))
> >> net = net . to ( device ) # Can be CPU or CUDA devices Spikingjelly termasuk kumpulan data neuromorfik berikut:
| Dataset | Sumber |
|---|---|
| ASL-DVS | Klasifikasi objek berbasis grafik untuk penginderaan penglihatan neuromorfik |
| CIFAR10-DVS | CIFAR10-DVS: Dataset Event-Stream untuk Klasifikasi Objek |
| Gerakan DVS128 | Sistem Pengenalan Giling Berbasis Acara yang Berbasis Acara Yang Rendah |
| ES-IMAGENET | ES-IMAGENET: Sejuta Dataset Klasifikasi Aliran Acara untuk Spiking Neural Networks |
| Hardvs | Hardvs: Meninjau kembali pengakuan aktivitas manusia dengan sensor penglihatan dinamis |
| N-Caltech101 | Mengubah Dataset Gambar Statis ke Dataset Neuromorphic Menurut Saccades Menggunakan Saccades |
| N-mnist | Mengubah Dataset Gambar Statis ke Dataset Neuromorphic Menurut Saccades Menggunakan Saccades |
| Gerakan Nav | Pengenalan Gesur Berbasis Acara dengan Penekanan Latar Belakang Dinamis Menggunakan Kemampuan Komputasi Smartphone |
| Spiking Heidelberg Digit (SHD) | Kumpulan data spiking Heidelberg untuk evaluasi sistematis jaringan saraf spiking |
| Dvs-lip | Fitur spatio-temporal multi-ground yang dirasakan jaringan untuk pembacaan bibir berbasis peristiwa |
Pengguna dapat menggunakan data acara asal dan membingkai data yang terintegrasi oleh SpikingJelly:
import torch
from torch . utils . data import DataLoader
from spikingjelly . datasets import pad_sequence_collate , padded_sequence_mask
from spikingjelly . datasets . dvs128_gesture import DVS128Gesture
# Set the root directory for the dataset
root_dir = 'D:/datasets/DVS128Gesture'
# Load event dataset
event_set = DVS128Gesture ( root_dir , train = True , data_type = 'event' )
event , label = event_set [ 0 ]
# Print the keys and their corresponding values in the event data
for k in event . keys ():
print ( k , event [ k ])
# t [80048267 80048277 80048278 ... 85092406 85092538 85092700]
# x [49 55 55 ... 60 85 45]
# y [82 92 92 ... 96 86 90]
# p [1 0 0 ... 1 0 0]
# label 0
# Load a dataset with fixed frame numbers
fixed_frames_number_set = DVS128Gesture ( root_dir , train = True , data_type = 'frame' , frames_number = 20 , split_by = 'number' )
# Randomly select two frames and print their shapes
rand_index = torch . randint ( low = 0 , high = fixed_frames_number_set . __len__ (), size = [ 2 ])
for i in rand_index :
frame , label = fixed_frames_number_set [ i ]
print ( f'frame[ { i } ].shape=[T, C, H, W]= { frame . shape } ' )
# frame[308].shape=[T, C, H, W]=(20, 2, 128, 128)
# frame[453].shape=[T, C, H, W]=(20, 2, 128, 128)
# Load a dataset with a fixed duration and print the shapes of the first 5 samples
fixed_duration_frame_set = DVS128Gesture ( root_dir , data_type = 'frame' , duration = 1000000 , train = True )
for i in range ( 5 ):
x , y = fixed_duration_frame_set [ i ]
print ( f'x[ { i } ].shape=[T, C, H, W]= { x . shape } ' )
# x[0].shape=[T, C, H, W]=(6, 2, 128, 128)
# x[1].shape=[T, C, H, W]=(6, 2, 128, 128)
# x[2].shape=[T, C, H, W]=(5, 2, 128, 128)
# x[3].shape=[T, C, H, W]=(5, 2, 128, 128)
# x[4].shape=[T, C, H, W]=(7, 2, 128, 128)
# Create a data loader for the fixed duration frame dataset and print the shapes and sequence lengths
train_data_loader = DataLoader ( fixed_duration_frame_set , collate_fn = pad_sequence_collate , batch_size = 5 )
for x , y , x_len in train_data_loader :
print ( f'x.shape=[N, T, C, H, W]= { tuple ( x . shape ) } ' )
print ( f'x_len= { x_len } ' )
mask = padded_sequence_mask ( x_len ) # mask.shape = [T, N]
print ( f'mask= n { mask . t (). int () } ' )
break
# x.shape=[N, T, C, H, W]=(5, 7, 2, 128, 128)
# x_len=tensor([6, 6, 5, 5, 7])
# mask=
# tensor([[1, 1, 1, 1, 1, 1, 0],
# [1, 1, 1, 1, 1, 1, 0],
# [1, 1, 1, 1, 1, 0, 0],
# [1, 1, 1, 1, 1, 0, 0],
# [1, 1, 1, 1, 1, 1, 1]], dtype=torch.int32)Lebih banyak kumpulan data akan dimasukkan di masa depan.
Jika beberapa tautan unduhan dataset tidak tersedia untuk beberapa pengguna, pengguna dapat mengunduh dari Mirror OpenI:
https://openi.pcl.ac.cn/openi/spikingjelly/datasets?type=0
Semua dataset yang disimpan di Mirror OpenI diizinkan dengan lisensi atau perjanjian penulisnya.
Spikingjelly menyediakan tutorial yang rumit. Berikut beberapa tutorial:
| Angka | Tutorial |
|---|---|
![]() | Konsepsi Dasar |
![]() | Neuron |
![]() | Lapisan tunggal yang terhubung sepenuhnya untuk mengklasifikasikan mnist |
![]() | Snn konvolusional untuk mengklasifikasikan fmnist |
![]() | Ann2snn |
![]() | Pemrosesan Dataset Neuromorfik |
![]() | Mengklasifikasikan gerakan DVS |
![]() | Koneksi berulang dan sinaps yang stateful |
![]() | Pembelajaran STDP |
![]() | Pembelajaran Penguatan |
Tutorial lain yang tidak tercantum di sini juga tersedia di dokumen https://spikingjelly.readthedocs.io.
Publikasi yang menggunakan SpikingJelly dicatat dalam publikasi. Jika Anda menggunakan SpikingJelly di kertas Anda, Anda juga dapat menambahkannya ke tabel ini dengan permintaan tarik.
Jika Anda menggunakan SpikingJelly dalam pekerjaan Anda, silakan kutip sebagai berikut:
@article{
doi:10.1126/sciadv.adi1480,
author = {Wei Fang and Yanqi Chen and Jianhao Ding and Zhaofei Yu and Timothée Masquelier and Ding Chen and Liwei Huang and Huihui Zhou and Guoqi Li and Yonghong Tian },
title = {SpikingJelly: An open-source machine learning infrastructure platform for spike-based intelligence},
journal = {Science Advances},
volume = {9},
number = {40},
pages = {eadi1480},
year = {2023},
doi = {10.1126/sciadv.adi1480},
URL = {https://www.science.org/doi/abs/10.1126/sciadv.adi1480},
eprint = {https://www.science.org/doi/pdf/10.1126/sciadv.adi1480},
abstract = {Spiking neural networks (SNNs) aim to realize brain-inspired intelligence on neuromorphic chips with high energy efficiency by introducing neural dynamics and spike properties. As the emerging spiking deep learning paradigm attracts increasing interest, traditional programming frameworks cannot meet the demands of automatic differentiation, parallel computation acceleration, and high integration of processing neuromorphic datasets and deployment. In this work, we present the SpikingJelly framework to address the aforementioned dilemma. We contribute a full-stack toolkit for preprocessing neuromorphic datasets, building deep SNNs, optimizing their parameters, and deploying SNNs on neuromorphic chips. Compared to existing methods, the training of deep SNNs can be accelerated 11×, and the superior extensibility and flexibility of SpikingJelly enable users to accelerate custom models at low costs through multilevel inheritance and semiautomatic code generation. SpikingJelly paves the way for synthesizing truly energy-efficient SNN-based machine intelligence systems, which will enrich the ecology of neuromorphic computing. Motivation and introduction of the software framework SpikingJelly for spiking deep learning.}}
Anda dapat membaca masalah dan mendapatkan masalah yang harus diselesaikan dan rencana pengembangan terbaru. Kami menyambut semua pengguna untuk bergabung dengan diskusi rencana pengembangan, menyelesaikan masalah, dan mengirim permintaan tarik.
Tidak semua dokumen API ditulis dalam bahasa Inggris dan Cina. Kami menyambut pengguna untuk menyelesaikan terjemahan (dari bahasa Inggris ke Cina atau dari bahasa Cina ke bahasa Inggris).
Multimedia Learning Group, Institute of Digital Media (NELVT), Peking University dan Laboratorium Peng Cheng adalah pengembang utama Spikingjelly.


Daftar pengembang dapat ditemukan di sini.