fangwei123456 / spikingjelly

SpikingJelly is an open-source deep learning framework for Spiking Neural Network (SNN) based on PyTorch.
https://spikingjelly.readthedocs.io
Other
1.35k stars 239 forks source link

关于resnet18_cifar10的问题 #108

Closed moxueyingyan closed 2 years ago

moxueyingyan commented 3 years ago

在resnet18_cifar10.py中main函数里,通过一个链接下载SJ-cifar10-resnet18_model-sample.pth,想问一下,这个文件是训练好的cifar10_resnet18模型么?我想换个数据集或者换成VGG网络的话,这个模型该如何获取?或者如何训练?@DingJianhao

fangwei123456 commented 3 years ago

VGG网络可以使用 https://github.com/fangwei123456/spikingjelly/blob/master/spikingjelly/clock_driven/model/spiking_vgg.py 构建,能够直接加载ANN的预训练模型

DingJianhao commented 3 years ago

直接训练一个relu神经元的多层神经网络就好。数据集是根据你自己的需求来定。换成VGG网络的话,需要使用满足ANN2SNN条件的ANN。先ANN训练后转换。如果你要直接训练SNN,请参考 @fangwei123456 的回复

moxueyingyan commented 3 years ago

谢谢!我用ANN转SNN。还想问一下,转换后SNN的脉冲平均发射率怎么计算呢?是脉冲总数除以神经元数量和时间步长吗?在ann2snn/init.py文件里get_values函数计算了counter,这个counter应该是T个时间步长内的脉冲总数吧?

fangwei123456 commented 3 years ago

看起来get_values是获取脉冲总数的,除以时间就得到发放频率了

moxueyingyan commented 3 years ago

和神经元的数量、batchsize没有关系吗?

fangwei123456 commented 3 years ago

要看具体如何计算。如果是计算某一层的发放率,一般是脉冲tensor直接求平均,包含了batch size,T是仿真步长。 如果是计算某一层每个神经元的发放率,是脉冲tensor直接在时间维度上求平均,不包含batch size。

moxueyingyan commented 2 years ago

还想问一下,ANN2SNN转换条件除了ANN中的激活函数选择ReLU以外,还有其他约束么?比如池化操作是不是要用平均池化,偏置等。多谢!

fangwei123456 commented 2 years ago

遵循原来的理论就行 https://spikingjelly.readthedocs.io/zh_CN/latest/clock_driven/5_ann2snn.html

按转换的理论,池化要选择平均池化,因为对每个时刻脉冲的最大池化不是对所有时刻统计出的脉冲频率的最大池化。偏置项是可以有的

moxueyingyan commented 2 years ago

好的,谢谢!这个文档我仔细看过,那这样的话对ANN的约束是比较少的